Есть ли способ сделать код такой: этоВызвать метод параметра типа
class GenericClass<T>
{
void functionA()
{
T.A();
}
}
Или, как вызвать функцию параметра типа (тип некоторые мой пользовательский класс).
Есть ли способ сделать код такой: этоВызвать метод параметра типа
class GenericClass<T>
{
void functionA()
{
T.A();
}
}
Или, как вызвать функцию параметра типа (тип некоторые мой пользовательский класс).
Для вызова метода родового объекта типа вы должны создать его экземпляр первым.
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");
}
}
Я думаю, что вы ищете generic type constraints:
class GenericClass<T> where T : MyBaseClass
{
void functionA<T>(T something)
{
something.A();
}
}
С точки зрения кода, публикуемую - для того, чтобы назвать что-то на T
, вам нужно будет передать его в качестве параметра functionA
. Ограничение, которое вы используете, должно гарантировать, что любой T
имеет метод A
, который можно использовать.
Re:
T.A();
Вы не можете вызывать статические методы типа-параметра, если это то, что вы имеете в виду. Вам лучше было бы реорганизовать это как метод экземпляра T
, возможно, с общим ограничением (where T : SomeTypeOrInterface
, с SomeTypeOrInterface
, определяющим A()
). Другой альтернативой является dynamic
, что позволяет вводить утиную форму экземпляра методов (через подпись).
Если вы имеете в виду, что T
известно лишь во время выполнения (как Type
), то вам будет нужно:
typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...);
Я понимаю из вашего кода, который вы хотите вызвать статический метод параметра типа, и это просто невозможно.
Смотрите здесь для получения дополнительной информации: Calling a static method on a generic type parameter
Можно ли использовать открытый класс GenericClass где T: SomeType1, SomeType2, new() –
Dusan
Нет, вы можете указать только один базовый класс (вы могли бы создать SomeTypeBase, указать это как ограничение типа и позволить SomeType1 и SomeType3 наследовать от этого SomeTypeBase). – Peter