Этого нельзя сделать, поскольку вы запрашиваете объявление переменной (magic
) незакрытого обобщенного типа.
Можно работать с незамкнутыми обобщениями, но только на уровне типа, например ::1004*
delegate T FactoryDelegate<T>(string name);
var magicType = typeof (FactoryDelegate<>);
, а затем «закрыть» тип на более позднем этапе:
var stringMagic = magicType.MakeGenericType(typeof(string));
Обновление: , в котором говорится, вот пример того, как вы можете использовать вышеупомянутую технику, чтобы также работать с "закрытыми" методами "типов" Тем не менее, не так элегантно, как было бы, если бы мы могли назначать незакрытые типы, хотя ..:
public class UnclosedMethod
{
private readonly MethodInfo _method;
public UnclosedMethod(Type type, string method)
{
_method = type.GetMethod(method);
}
public T Invoke<T>(string name)
{
var fact = _method.MakeGenericMethod(typeof(T));
return (T)fact.Invoke(this, new object[] { name });
}
}
А затем в коде сделать это:
var magic = new UnclosedMethod(typeof(Foo), "Factory");
var x = magic.Invoke<string>("bar");