Вызовите метод типа параметра - PullRequest
5 голосов
/ 29 июля 2010

Есть ли способ сделать код такой:

class GenericClass<T>
{
    void functionA()
    {
        T.A();
    }
}

Или, как вызвать функцию параметра типа (тип - это мой собственный класс).

Ответы [ 4 ]

6 голосов
/ 29 июля 2010

Re:

T.A();

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

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

typeof(GenericClass<>).MakeGenericType(type).GetMethod(...).Invoke(...);
2 голосов
/ 29 июля 2010

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

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");
    }
}
2 голосов
/ 29 июля 2010

Я думаю, что вы ищете ограничения универсального типа :

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

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

1 голос
/ 29 июля 2010

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

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

...