![](/img/trans.png)
[英]How can I walk the method call to an Action, Func, or Delegate in introspector for a custom rule?
[英]Can I call an Action<T> stored as 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 { }
我從動作回調創建MyAction實例
public static MyAction Factory<T>(Action<T> callback) {
return new MyAction() {
myDelegate = callback, IMyObjectType = typeof (T)
};
}
是否可以調用委托並傳遞IMyObject?
稍后,我在嘗試調用Delegate(Action)之前設置了IMyObject。
也使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);
如果類型不是固定的(例如:它只是Delegate
,而您不知道T
),則可以使用:
action.myDelegate.DynamicInvoke(args);
但這比較慢。 如果您要進行大量操作,則應避免這種情況。 坦白地說,在整個過程中只使用Action<object>
(或類似的Action<object>
)並在回調中進行強制轉換會更有效-然后您的代碼將知道委托類型並可以使用常規調用。
您必須使用Delegate.DynamicInvoke
來調用無類型的Delegate
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.