如何通过动作<;在T>;使用派生类作为Action参数
本文关键字:派生 参数 Action 何通过 lt gt | 更新日期: 2023-09-27 18:11:58
给定:
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);
如果可能的话,试着使用泛型:
void MyFunction<T>(Action<T> DoAction) where T : BaseClass, new()
{
DoAction(new T());
}
然后你可以写:
MyFunction<DerivedClass>(AnotherFunction);
这将:
- 进行编译时检查以确保您使用的类型是
BaseClass
或从其派生的类型。您不会因为该类型没有扩展BaseClass
而出现运行时错误 - 进行编译时检查以确保该类型具有无参数构造函数,而不是在运行时抛出异常(如果不存在(
- 进行编译时检查,以确保为
Action
提供的方法接受适用于所用类型的参数,而不是在运行时如果类型不合适则抛出异常