2013-05-03 39 views
6

考虑:如何将动作<in T>与派生类作为Action参数传递?

class BaseClass {} 
class DerivedClass : BaseClass {} 

我想写可以接受一个BaseClass的参数的操作功能。该函数将创建指定类型的对象并将其传递给Action。

void MyFunction(Type type, Action<BaseClass> DoAction) 
{ 
    BaseClass obj = (BaseClass)Activator.CreateInstance(type); 
    DoAction(obj); 
} 

我想在AnotherFunction其参数传递是一个DerivedClass:

void AnotherFunction(DerivedClass x) 
{ 
} 

我应该如何调用MyFunction的?以下是无效的,由于该AnotherFunction说法:

MyFunction(typeof(DerivedClass), AnotherFunction); 

回答

11

如果可能的话,尽量使用泛型代替:

void MyFunction<T>(Action<T> DoAction) where T : BaseClass, new() 
{ 
    DoAction(new T()); 
} 

然后,你可以这样写:

MyFunction<DerivedClass>(AnotherFunction); 

这将:

  • 做编译时检查以确保您使用的类型是BaseClass或源自它的类型。您不会遇到运行时错误,因为类型不会延伸BaseClass
  • 做编译时检查,以确保该类型具有无参数的构造函数,而不是在运行时抛出异常(如果不存在的话)。
  • 编译时检查以确保为Action提供的方法接受适用于所用类型的参数,而不是在运行时在类型不合适时抛出异常。
+0

+1你击败了我的编辑。 – 2013-05-03 19:36:26

+1

我认为MyFunction(AnotherFunction)不会显式指定泛型参数类型。 – jure 2013-05-03 19:44:22

+0

@jure你是对的,它不能推断出类型。 – Servy 2013-05-03 19:46:25

相关问题