C # Generics Как я могу получить тип, передаваемый в качестве аргумента для универсального метода без типа объекта в качестве параметра? - PullRequest
0 голосов
/ 09 июня 2018

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

public GetGenericArgumentName<T>() where T : IFoo
{
        StackFrame fr = new StackFrame(0, true);
        StackTrace st = new StackTrace(fr);
        var ga = fr.GetMethod().GetGenericArguments();

        foreach (var item in ga)
        {
            Console.WriteLine(item.Name);
        }
}

Но я не смог получить исходный тип у вызывающей стороны.

Допустим, я должен получить классы из IFoo

public class Foo : IFoo {}
public class Foo2 : IFoo {}

Если я вызову их следующими методами, я ожидаю этих результатов:

/* 1 */ GetGenericArgumentName<Foo>()
/* 2 */ GetGenericArgumentName<Foo2>()

Для первого я ожидал Fooкак результат, и для второго Foo2.Чего мне не хватает?

1 Ответ

0 голосов
/ 09 июня 2018

Вам вообще не нужно использовать трассировку стека - просто используйте typeof(T):

Console.WriteLine(typeof(T).Name);

. При этом будет напечатано Foo для первого вызова и Foo2 для второго вызова.

Это проще, надежнее и эффективнее, чем подниматься в стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...