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++泛型方法和类型是在编译类型中构造的。因此,当您调用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++泛型的更多信息,您可以在这里查看