C# Обобщенные делегаты c Обобщенными методами
м.б. кто-нибудь поможет!
Задача - передать обобщённый метод в другой класс.
Нерабочий код:
class Program
{
static void Main(string[] args)
{
//Create B
var bbb = new MyClassB(GetValue);
}
//обобщённый метод, который надо передать в класс MyClassB
public static T GetValue<T>()
{
Type type = typeof(T);
if (type == typeof(int))
{
return (T)(object)5;
}
throw new NotSupportedException();
}
}
public delegate T MyDel<T>();
class MyClassB
{
public MyClassB(MyDel<Type> method)
{
var n= method<int>(); //как вызвать метод?
}
}
Есть какие-нибудь идеи? Спасибо!
Ответы (1 шт):
Автор решения: Alexander Petrov
→ Ссылка
Если имеется делегат MyDel<T> method, то его вызов делается так: method().
Чтобы иметь возможность передавать такой делегат в конструктор, нужно задать обобщённый параметр типа на самом классе: class MyClassB<T>.
И, наконец, нужно явно указывать тип при создании делегата: GetValue<int>.
В итоге, получается примерно следующее:
class Program
{
static void Main()
{
var b1 = new MyClassB<int>(GetValue<int>); // ok
var b2 = new MyClassB<string>(GetValue<string>); // exception
}
public static T GetValue<T>()
{
Type type = typeof(T);
if (type == typeof(int))
{
return (T)(object)5;
}
throw new NotSupportedException();
}
}
public delegate T MyDel<T>();
class MyClassB<T>
{
public MyClassB(MyDel<T> method)
{
var n = method();
Console.WriteLine(n + " " + n.GetType());
}
}
Возможно, это не то, что вам нужно. Опишите подробнее, что в конечном итоге хотите получить.