2010-07-29 2 views

ответ

2

Для вызова метода родового объекта типа вы должны создать его экземпляр первым.

public static void RunSnippet() 
{ 
    var c = new GenericClass<SomeType>(); 
} 

public class GenericClass<T> where T : SomeType, new() 
{ 
    public GenericClass(){ 
     (new T()).functionA(); 
    } 
} 

public class SomeType 
{ 
    public void functionA() 
    { 
     //do something here 
     Console.WriteLine("I wrote this"); 
    } 
} 
+0

Можно ли использовать открытый класс GenericClass где T: SomeType1, SomeType2, new() – Dusan

+0

Нет, вы можете указать только один базовый класс (вы могли бы создать SomeTypeBase, указать это как ограничение типа и позволить SomeType1 и SomeType3 наследовать от этого SomeTypeBase). – Peter

2

Я думаю, что вы ищете generic type constraints:

class GenericClass<T> where T : MyBaseClass 
{ 
    void functionA<T>(T something) 
    { 
     something.A(); 
    } 
} 

С точки зрения кода, публикуемую - для того, чтобы назвать что-то на T, вам нужно будет передать его в качестве параметра functionA. Ограничение, которое вы используете, должно гарантировать, что любой T имеет метод A, который можно использовать.

+0

Нет, у меня есть эта ошибка: «T» является «параметр типа», который не действует в данном контексте – Dusan

+0

@shandu - ответ обновляется. Вам также необходимо указать общий параметр. – Oded

+0

Можно ли использовать класс GenericClass где T: MyBaseClass1, MyBaseClass2 – Dusan

6

Re:

T.A();

Вы не можете вызывать статические методы типа-параметра, если это то, что вы имеете в виду. Вам лучше было бы реорганизовать это как метод экземпляра T, возможно, с общим ограничением (where T : SomeTypeOrInterface, с SomeTypeOrInterface, определяющим A()). Другой альтернативой является dynamic, что позволяет вводить утиную форму экземпляра методов (через подпись).

Если вы имеете в виду, что T известно лишь во время выполнения (как Type), то вам будет нужно:

typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...); 
1

Я понимаю из вашего кода, который вы хотите вызвать статический метод параметра типа, и это просто невозможно.

Смотрите здесь для получения дополнительной информации: Calling a static method on a generic type parameter

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