8

鉴于:

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);
4

1 回答 1

13

如果可能,请尝试使用泛型:

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

然后你可以写:

MyFunction<DerivedClass>(AnotherFunction);

这将:

  • 进行编译时检查以确保您使用的类型是BaseClass或从它派生的类型。你不会得到运行时错误,因为类型没有扩展BaseClass
  • 进行编译时检查以确保该类型具有无参数构造函数,而不是在运行时抛出异常(如果不存在)。
  • 进行编译时检查以确保为 提供的方法Action接受适合所使用类型的参数,而不是在类型不合适时在运行时抛出异常。
于 2013-05-03T19:35:35.377 回答