Может ли этот код, где он проверяет тип и затем приведение, быть улучшен? - PullRequest
1 голос
/ 20 января 2011

У меня есть этот код, но я чувствую, что его можно улучшить.Что ты думаешь?

public void MyMethod(object Value)
{
    if (Value.GetType() == typeof(List<Document>))
    {
        var documentList = Value as List<Document>;
        if (MainForm != null)
            MainForm.BindData(documentList);
    }
    else if (Value.GetType() == typeof(Document))
    {
        var document = Value as Document;
        if (MainForm != null)
            MainForm.BindData(document);
    }
}

Ответы [ 7 ]

3 голосов
/ 20 января 2011

Маловероятно, что метод BindData () принимает что-либо еще, кроме аргумента типа object .Или что что-то хорошее случается, когда этот метод вызывается с объектом, который не может выступать в качестве источника привязки, вы захотите узнать об этом.Таким образом:

public void MyMethod(object Value)
{
    MainForm.BindData(Value);
}

Форма, которая принимает привязку как к объекту , так и к коллекции объектов, очень необычна.Это требует совершенно другого вида пользовательского интерфейса.

1 голос
/ 20 января 2011

Ответ Оли - лучший, Марк тоже хороший. Если вам нужен только один метод, то здесь есть еще один способ:

public void MyMethod(object Value)
{
    List<Document> documents = Value as List<Document>;
    if (Value is Document)
    {
        documents = new List<Document>();
        documents.Add((Document) Value);
    }

    if (MainForm != null && documents != null)
        MainForm.BindData(documents);
}

или для небольшой оптимизации производительности за счет краткости:

public void MyMethod(object Value)
{
    List<Document> documents = null;
    if (Value is List<Document>)
    {
        documents = (List<Document>) Value;
    }
    else if (Value is Document)
    {
        documents = new List<Document>();
        documents.Add((Document) Value);
    }

    if (MainForm != null && documents != null)
        MainForm.BindData(documents);
}
1 голос
/ 20 января 2011

Вы можете перегрузить метод:

public void MyMethod(List<Document> documentList)
{
   if (MainForm != null)
     MainForm.BindData(documentList);
}

public void MyMethod(Document document)
{       
   if (MainForm != null)
     MainForm.BindData(document);
}

Однако это повторяющийся код, который также не рекомендуется.


Вместо этого, возможно, попробуйте параметризовать метод:

public void MyMethod<T>(T document)
{       
   if (MainForm != null)
     MainForm.BindData(document);
}

Среда выполнения должна отправлять с корректной перегрузкой BindData() без преобразования, при условии, что BindData() также сделан универсальным:

in MainForm:

public void BindData<T>(T Data) {
  if (T is typeof(Document)) {
    // Bind a document
  } else {
     ...
  }
}
0 голосов
/ 30 сентября 2011

В дополнение к другим ответам (независимо от того, что вы выберете), он выглядит как хороший кандидат для превращения в метод расширения, например:

static class MainFormExtensions
{
    public static void BindData(this MainForm form, object value)
    {
        //Whichever implementation you prefer, E.G.
        MainForm.BindData(value as Document);
    }
}

Тогда вы сможете вызвать его следующим образом, который легко читается и сообщает о поведении метода.

object value = new Document();
MainForm.DataBind(value);

Самое приятное, что вы даете компилятору реальную возможность определить тип вашего значения.Если через год вы в конечном итоге вызовете метод в строго типизированной усадьбе, то компилятор будет знать, что он игнорирует ваш метод, и вызывает MainForm(Document document) напрямую, чтобы повысить производительность.Тогда, надеюсь, однажды ваш (уродливый) метод станет избыточным и может быть удален.

MainForm.DataBind(new Document());
0 голосов
/ 20 января 2011

Я думаю, что это лучше?

public void MyMethod(object Value)
    {

                            var documentList = Value as List<Document>;
                            if (documentList != null)
                            {
                               if (MainForm != null)
                                MainForm.BindData(documentList);
                            }

                            var document = Value as Document;
                            if (document != null)
                             { 
                            if (MainForm != null)
                                MainForm.BindData(document);
                             }
}
0 голосов
/ 20 января 2011

Первое, что вы можете сделать, это:

public void MyMethod(object Value)
{
    var documentList = Value as List<Document>;
    if (documentList != null)
        MainForm.BindData(documentList);
    else
    {
         var document = Value as Document;
         if (MainForm != null)
            MainForm.BindData(document);
    }
}

Но, тем не менее, обычно для этих случаев можно сделать лучший дизайн

0 голосов
/ 20 января 2011

Да.Не попадайтесь в ситуацию, когда переменная (Value) может содержать объект двух совершенно не связанных типов (List<Document> или Document).

Не видя, как используется этот код (т.е.контекст), я не могу быть более конкретным, хотя.

...