这个代码可以检查类型然后再进行转换吗?

时间:2011-01-20 12:56:45

标签: c# .net c#-3.0 casting

我有这段代码,但我觉得可以改进。你有什么想法?

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 个答案:

答案 0 :(得分:3)

除了 object 类型的参数之外,BindData()方法不太可能采用其他任何方法。或者,当使用不能作为绑定源的对象调用此方法时,会发生任何好事,您将需要了解它。因此:

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

接受对象对象集合的绑定表单非常不寻常。它需要一种非常不同的用户界面。

答案 1 :(得分:1)

您可以重载该方法:

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 {
     ...
  }
}

答案 2 :(得分:1)

奥利的答案是最好的,马克也很好。如果您只是想要一种方法,那么还有另一种方法:

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);
}

答案 3 :(得分:0)

是。不要陷入变量(Value)可以容纳两个完全不相关的类型(List<Document>Document)的对象的情况。

虽然没有看到如何使用这段代码(即上下文),但我不能再具体了。

答案 4 :(得分:0)

你能做的第一件事就是:

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);
    }
}

但是,通常情况下,可以为这些案例设计更好的设计

答案 5 :(得分:0)

我认为这样更好?

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);
                             }
}

答案 6 :(得分:0)

除了其他答案(无论你选择哪个),它看起来像是一个很好的候选者,可以像这样做:

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());