Есть ли способ сделать что-то вроде этого?Установка параметра типового типа из параметра метода
void SomeMethod(Type generic)
{
SomeGenericMethod<generic>();
}
Мне нужно передать тип как «нормальный» параметр, а не общий параметр типа.
Есть ли способ сделать что-то вроде этого?Установка параметра типового типа из параметра метода
void SomeMethod(Type generic)
{
SomeGenericMethod<generic>();
}
Мне нужно передать тип как «нормальный» параметр, а не общий параметр типа.
Вы можете сделать это с отражением:
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));
}
}
Тем не менее, используя отражение, таким образом, означает, что вы теряете некоторые из преимуществ использования дженериков в первую очередь, так что вы можете захотеть взглянуть на другой альтернативы дизайна.
Предполагая, что ваш метод определен в классе под названием MyClass, это должно сделать это:
var MyObject = new MyClass();
typeof(MyClass).GetMethod("SomeGenericMethod").MakeGenericMethod(generic).Invoke(myObject, null);
Type.GetMethod() получает объект, который описывает метод, определенный в типе он призвал. Метод является общим, поэтому нам нужно вызвать MakeGenericMethod и передать его один общий параметр.
Затем мы вызываем метод, передавая объект, который мы хотим вызвать, и любые его аргументы. Поскольку он не принимает никаких аргументов, мы просто передаем null.
Вы можете использовать отражение для достижения большинства вещей, но не совсем ясно (для меня), что вы хотите сделать. Можете ли вы разместить более связанный код? –
FWIW, большинство API, которые выставляют оба, будут иметь общий вызов, не общий, поскольку он может просто передать typeof (T) в качестве типа. Не уверен, что это сценарий, в котором вы находитесь, но на всякий случай. :) –