C#调用泛型方法中某个以指定类型为参数的方法

本文关键字:类型 参数 方法 泛型方法 调用 | 更新日期: 2023-09-27 18:19:29

我是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中使用类型T生成指定值,并调用指定的句柄方法。它将在C++中工作,但C#一直像一样告诉我

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

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

C#调用泛型方法中某个以指定类型为参数的方法

这是因为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#泛型是在运行时编译的。编译器看到对具有unkonwn类型的Handle方法的调用,因此当您想在编译时调用具有unkonown类型的方法时,编译器会抱怨。

如果T是参数中的类型,那么您实际上可以将C#中的Handle方法与泛型一起使用,如下所示:

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++泛型的更多信息,您可以在这里查看