2

我将动作存储为代表。我也将 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

4

3 回答 3

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为包含参数的 a。这取决于您的要求。

myDelegate = () => callback(argument);
于 2013-11-07T10:25:27.633 回答
2

如果类型不固定(如:它只是Delegate,而您不知道T),那么您可以使用:

action.myDelegate.DynamicInvoke(args);

但这相对较慢。如果你做了很多,你会想避免这种情况。坦率地说,始终使用Action<object>(或类似的)并在回调中强制转换会更有效- 然后您的代码将知道委托类型并可以使用常规调用。

于 2013-11-07T10:26:50.220 回答
0

您必须使用Delegate.DynamicInvoke来调用 untyped Delegate

于 2013-11-07T10:25:36.433 回答