C#调用一些方法,将指定的类型作为Generic Method中的参数

时间:2014-08-26 09:25:03

标签: c# generic-method

我是C#的初学者,并且遇到困扰我的问题。

如果有人提出解决方案,我将非常感激。

我的代码类似于:

public class SomeClass 
{ 
  public SomeClass()
  {
    GenericMethod<Object1>(out result);
    ....
  }
  public void GenericMethod<T>(out Result result) where T : Parent
  {
     T t = new T();
     //do something need to be done all parent's child object ( Object1, Object2..)
     ...somthing same things...
     //and do specific things to be done relatively
     Handle(t, result);
  }
  // Object1 is child of Parent
  private void Handle(Object1 arg1, out Result result)
  {
    //do something need to be done for Object1;
  }
  // Object1 is child of Parent
  private void Handle(Object2 arg1, out Result result)
  {
    //do something need to be done for Object2;
  }
  ....
}

你会发现, 我想做的很简单。

在GenericMethod中使用Type T创建指定值, 并调用指定的Handle方法。 它可以在C ++中运行,但C#一直告诉我

“无法将'T'表达式转换为'Object1'类型”

我该如何解决这个问题? 提前完成。

1 个答案:

答案 0 :(得分:1)

这是因为C ++泛型方法和类型是在编译类型下构造的。因此,当您调用GenericMethod时,编译器将为您构建该代码,并且将知道要调用的Handle方法。

在编译器为您构建方法后,C ++代码将如下所示:

public class SomeClass 
{ 
  public SomeClass()
  {
    GenericMethod<Object1>(out result);
    ....
  }
  public void GenericMethod<Object1>(out Result result)
  {
     Object1 t = new Object1();
     Handle(t, result);
  }
  private void Handle(Object1 arg1, out Result result)
  {
    //do something need to be done for Object1;
  }
  private void Handle(Object2 arg1, out Result result)
  {
    //do something need to be done for Object2;
  }
  ....
}

正如您所看到的,现在很清楚编译器将使用哪种Handle方法。

C#泛型在运行时编译。编译器看到对具有未知类型的Handle方法的调用,因此编译器在编译时想要调用具有unkonwn类型的方法时会抱怨。

如果Handle是参数中的类型,您可以实际使用C#中的T方法,如下所示:

public void GenericMethod<T>(out Result result) where T : new(), BaseClass
{
     T t = new T();
     Handle(t, result);
}
private void Handle(BaseClass arg1, out Result result)
{
    //do something need to be done for BaseClass;
}

有关C#和C ++泛型的更多信息,您可以查看here