假设:
class BaseClass {}
class DerivedClass : BaseClass {}
我想编写一个可以接受带有BaseClass参数的Action的函数。该函数将创建指定类型的对象并将其传递给Action。
void MyFunction(Type type, Action<BaseClass> DoAction)
{
BaseClass obj = (BaseClass)Activator.CreateInstance(type);
DoAction(obj);
}
我想传入其参数为DerivedClass的AnotherFunction:
void AnotherFunction(DerivedClass x)
{
}
我该怎么称呼MyFunction?由于AnotherFunction参数,以下内容无效:
MyFunction(typeof(DerivedClass), AnotherFunction);
答案 0 :(得分:12)
如果可能,请尝试使用泛型:
void MyFunction<T>(Action<T> DoAction) where T : BaseClass, new()
{
DoAction(new T());
}
然后你可以写:
MyFunction<DerivedClass>(AnotherFunction);
这将:
BaseClass
或从中派生的类型。您不会遇到运行时错误,因为类型不会扩展BaseClass
。Action
提供的方法接受适合所用类型的参数,而不是在运行时抛出异常(如果类型不合适)。