2015-12-10 3 views
-1

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

public List<Tuple<AbstractPlateforme, AbstractPlateforme>> tuple; 
Type type1 = tuple.Item1.GetType(); 
//This line gives me error: Error CS0118 'type1' is a variable but is used like a type 
var plateforme = PlateformeHelper.GetPlateforme<type1>(); 

//This is my method from my PlateformeHelper class which returns an instance of an instantiated object of the same type (the list may only contain 1 object of that type which inherit from AbstractPlateforme) 
public static T GetPlateforme<T>() where T : AbstractPlateforme 
{ 
    return (T)ListePlateforme.Find(x => x.GetType() == typeof (T)); 
} 
+3

слишком абстрактно, что вы пытаетесь достичь? Почему «ListePlateforme» хранит разные типы? –

+0

Мне нужно хранить разные типы abstractPlateforme, поэтому я могу получить конкретную информацию для каждого класса и получить доступ к ним из другого класса. –

+0

У вашего кода есть синтаксические ошибки, исправьте его первым: кортеж в строке1 - это список и список не имеют Item1 в строке2. – mecek

ответ

3

Вы должны создать перегрузку, которая принимает Type параметр вместо того, чтобы быть родовым:

public static AbstractPlateforme GetPlateforme(Type type) 
{ 
    return (AbstractPlateforme)ListePlateforme.Find(x => x.GetType() == type); 
} 

public static T GetPlateforme<T>() where T : AbstractPlateforme 
{ 
    return (T)GetPlateforme(typeof(T)); 
} 

Тогда вы можете просто позвонить новая перегрузка вместо:

var plateforme = PlateformeHelper.GetPlateforme(type1); 
+0

Единственное, что я бы добавил, это то, что, поскольку не-общий метод возвращает объект 'object', после вызова будет необходимо выполнить бросок. –

+0

Вы, конечно, правы, немного изменили код. –

+1

Да, хорошо, если у него есть тип и он может бросить на него, он также может назвать общую версию. Вы можете использовать только фактический тип, вы не можете легко, без использования отражения, отбрасывать тип, хранящийся в переменной или выражении, если это даже необходимо. Если вы не написали код, основанный на типе типа типа X, то, скорее всего, вы не воспользуетесь тем, что X предоставляет в любом случае, или ему придется писать код вызова как общий. –

0

Если вы хотите использовать отражение с обобщениями, может быть, это поможет вы видите код ниже:

Type type1 = tuple.Item1.GetType();  
    MethodInfo method = typeof(PlateformeHelper).GetMethod("GetPlateforme"); 
    MethodInfo generic = method.MakeGenericMethod(type1); 
    generic.Invoke(null, null); 

Для получения дополнительной информации MakeGenericMethod

Надежда быть полезным XD.

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