2011-10-20 2 views
2

Я хотел бы создать общий делегат, но я знаю только тип во время выполнения.Создать делегат динамически из имени типа

здесь делегат, что я хочу создать:

public delegate void MyDel<T>(T t,string msg); 

и здесь является метод, в котором я хочу, чтобы создать экземпляр и использовать делегат

Type typeSet = set.GetType(); 
MethodInfo method = typeSet.GetMethod("Add");  
Delegate test = Delegate.CreateDelegate(typeof(MyDel<typeSet>, method); 

где Typeset это неизвестная для меня сборник. и, к сожалению, метод, который я хочу назвать, не является статичным.

У кого-нибудь есть идеи?

Заранее спасибо

ответ

4

Вам нужно создать определенный тип делегата с помощью MakeGenericType:

Type template = typeof(MyDel<>); 
Type specific = template.MakeGenericType(typeSet); 
Delegate test = Delegate.CreateDelegate(specific, method); 

Я думаю это то, что вы после ...

+0

спасибо за ваш ответ, как я могу назвать делегата сейчас? что-то вроде этого: if (test! = null) { MyDel <> myDel = (MyDel <>) test; myDel ("blabla"); } – user1005016

+0

@ user1005016: Если у вас есть аргументы, вы можете использовать 'Delegate.InvokeDynamic' и можете быть уверены, что они в порядке, но вы не знаете тип компиляции делегата. –

+0

Я хочу вызвать метод «добавить» на объектных объектах DbSet public delegate void DelegateAddObject (T t, объект DbSet); Тип contextType = (контекст как объект) .GetType(); var set = (contextType.GetProperty (entitySetName)). GetValue (контекст, null); Тип typeSet = set.GetType(); Метод MethodInfo = typeSet.GetMethod ("Добавить"); Тип template = typeof (DelegateAddObject <>); Тип specific = template.MakeGenericType (typeSet); Делегат test = Delegate.CreateDelegate (конкретный, метод); Где контекст - мой dataContext. Но я получаю следующую ошибку: ** Ошибка привязки к целевому методу ** – user1005016

Смежные вопросы