[英]Subscribe to event from reflection with generic parameters
好吧,所以我想使用反射來訂閱一個事件,該事件具有通用參數。
我還想確保當我說“訂閱活動”時,我使用了正確的術語。 我的意思是這樣的:
Mediator.EventMediator.Instance.PopulateItemsEvent += (sender, args) =>
{
}
我想在你們中領先一些:Stackoverflow上有類似的問題,我已經閱讀了所有可以找到的問題。 大多數與沒有通用參數的事件或具有通用參數的方法有關。
因此,我有一個名為“ o”的變量,它本身是一個反映的屬性,它是一個ObservableCollection。 我想從“ o”事件中獲取事件(特別是“ CollectionChanged”)。 但這是我不知道該怎么做。
為了得到“ o”,我使用了如下反射:
var o = propertyInfo.GetValue(this, null);
我嘗試的第一個建議是“ GetRaisedMethod”,它是EventInfo的屬性。
因此,為了獲取EventInfo,我使用了以下代碼:
EventInfo evi = o.GetType().GetEvent("CollectionChanged", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
'evi'似乎包含正確的信息,但是如果我使用此行:
var invocation = evi.GetRaiseMethod();
我得到空。 但是我已經在瀏覽過的問題中讀到了這件事,這似乎很普遍。 即使如此,我仍然認為應該嘗試一下。
然后我繼續討論另一種方法,在另一個問題中提出該方法是否可行。 如下所示:
var field = typeof(ObservableCollection<>).GetField("CollectionChanged", BindingFlags.NonPublic | BindingFlags.Instance);
var eventDelegate = field.GetValue(o) as MulticastDelegate;
現在這給我造成了一個例外,我縮小到這兩行的第二行。 消息如下:
“不能對類型為Type.ContainsGenericParameters為true的字段執行后期綁定操作。”
因此,這就是我認為這是具有通用參數的事件的地方。 但是我找不到任何可以解決這個問題的地方。 當然,對於方法,您可以使用MethodInfo.MakeGenericMethod(),但EventInfo中沒有這樣的東西。
我想要的是能夠像平常一樣訂閱該事件,但到目前為止,它使我難以理解。
您可能還認為我可以做這樣的事情:
(o as ObservableCollection<>).CollectionChanged +=...
但是我不能。 我已經嘗試了上述所有形式的變體(沒有尖括號,帶有我自己的類型(類型為Type,這是集合中項目的類型)。沒有一種對我有用。肯定會更簡單,但是我還沒有找到使用這種方法的方法。
EventInfo.AddEventHandler
方法可以為您完成工作,請看以下示例:
public static void Main()
{
var collection = new ObservableCollection<string>(new [] { "a", "b" });
var o = (object)collection;
var eventInfo = o.GetType().GetEvent("CollectionChanged");
var myEventHandler = new Action<object, NotifyCollectionChangedEventArgs>(( s, a ) => Console.WriteLine(a));
var del = Delegate.CreateDelegate(eventInfo.EventHandlerType, myEventHandler.Method);
eventInfo.AddEventHandler(o, del);
collection.Add( "x" );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.