2012-05-25 7 views
2

Есть ли способ сделать что-то вроде этого?Установка параметра типового типа из параметра метода

void SomeMethod(Type generic) 
{ 
    SomeGenericMethod<generic>(); 
} 

Мне нужно передать тип как «нормальный» параметр, а не общий параметр типа.

+0

Вы можете использовать отражение для достижения большинства вещей, но не совсем ясно (для меня), что вы хотите сделать. Можете ли вы разместить более связанный код? –

+0

FWIW, большинство API, которые выставляют оба, будут иметь общий вызов, не общий, поскольку он может просто передать typeof (T) в качестве типа. Не уверен, что это сценарий, в котором вы находитесь, но на всякий случай. :) –

ответ

4

Вы можете сделать это с отражением:

public class foo 
{ 
    public void SomeMethod(Type type) 
    { 
     var methodInfo = this.GetType().GetMethod("SomeGenericMethod"); 
     var method = methodInfo.MakeGenericMethod(new[] { type }); 
     method.Invoke(this, null); 
    } 

    public void SomeGenericMethod<T>() 
    { 
     Debug.WriteLine(typeof(T).FullName); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new foo(); 
     foo.SomeMethod(typeof(string)); 
     foo.SomeMethod(typeof(foo)); 
    } 
} 

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

1

Предполагая, что ваш метод определен в классе под названием MyClass, это должно сделать это:

var MyObject = new MyClass(); 
typeof(MyClass).GetMethod("SomeGenericMethod").MakeGenericMethod(generic).Invoke(myObject, null); 

Type.GetMethod() получает объект, который описывает метод, определенный в типе он призвал. Метод является общим, поэтому нам нужно вызвать MakeGenericMethod и передать его один общий параметр.

Затем мы вызываем метод, передавая объект, который мы хотим вызвать, и любые его аргументы. Поскольку он не принимает никаких аргументов, мы просто передаем null.

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