我将Action存储为Delegate。我也将T存储为接口。
以后有什么办法我可以调用Action并传递对象吗?
public class MyAction {
public IMyObject IMyObject { get; set; }
public Delegate myDelegate { get; set; }
public Type IMyObjectType { get; set; }
}
IMyObject是一个空接口
public interface IMyObject { }
我从Action回调
创建MyAction实例public static MyAction Factory<T>(Action<T> callback) {
return new MyAction() {
myDelegate = callback, IMyObjectType = typeof (T)
};
}
是否可以调用委托并传递IMyObject?
稍后我在尝试调用Delegate(Action)
之前设置了IMyObject答案 0 :(得分:2)
使MyAction也通用
class MyAction<T> where T : IMyObject
{
public T IMyObject { get; set; }
public Action<T> action { get; set; }
public Type IMyObjectType { get { return typeof(T); }
}
问题在于,如果不在编译时知道参数的类型,就无法创建MyAction,除非您使用反射创建它(如果您多次调用该操作并希望优化执行,这可能很有用)。
使用DynamicInvoke
调用操作
(使用反射并且非常慢)。
您还可以考虑将其设为包含参数的Action
。这取决于您的要求。
myDelegate = () => callback(argument);
答案 1 :(得分:2)
如果类型未修复(例如:它只是Delegate
,而您无法知道T
),那么您可以使用:
action.myDelegate.DynamicInvoke(args);
但这相对较慢。如果你这样做,你会想要避免这种情况。坦率地说,在整个过程中使用Action<object>
(或类似)并在回调中强制转换会更高效 - 然后您的代码将知道委托类型并且可以使用常规调用。 / p>
答案 2 :(得分:0)
您必须使用Delegate.DynamicInvoke
来调用无类型的Delegate
。