我可以将Action <t>称为委托</t>

时间:2013-11-07 10:21:45

标签: c# c#-4.0 generics casting delegates

我将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

3 个答案:

答案 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