我有一个类似的方法:
public void DoSomething<T>() where T : BaseClass
我用作:
DoSomething<MyClass>();
我的问题是:我已将实例化的类存储在变量中,我想用它来调用此方法。
例: 我有一个变量来存储类;
BaseClass instantiated;
在某些时候,我实例化
instantiated = new MyClass(); //Inherits from BaseClass
在另一个时间,我需要调用该方法,但我所拥有的只是&#34;实例化&#34;变量。我在方法&#;&lt;&gt;?
中输入了什么DoSomething<?>();
答案 0 :(得分:2)
通用方法让我们有一个自定义的返回类型。由于您没有使用它,即您的返回类型为void
,因此它实际上根本不需要是通用方法:
public void DoSomething(BaseClass myInstance){
// Instance it and cast to a BaseClass:
BaseClass obj=(BaseClass)Activator.CreateInstance(myInstance.GetType(),param1,param2);
// Do anything else with obj.
}
正如你所说,你已经有了一个现有的对象,那就像这样被称为:
DoSomething(thatObject);
或者 - 这是更常见的形式 - 定义虚拟Clone()方法:
public class BaseClass{
public virtual BaseClass Clone(){
return new BaseClass();
}
}
public class MyClass : BaseClass{
public override BaseClass Clone(){
return new MyClass();
}
}
...
BaseClass myClone=thatObject.Clone();
如果我们要返回新创建的对象,那么这有点不同。它可以很好地利用泛型:
public T DoSomething<T>() where T:BaseClass{
// Instance it and cast to T:
T obj=(T)Activator.CreateInstance(typeof(T),param1,param2);
// Do anything else with obj.
return obj;
}
我们这样打电话:
MyClass myClass=DoSomething<MyClass>();
这不能用运行时已知类型完成,因为那时返回类型也是未知的。
Here's an example最后一个在行动中。