C#Generics如何将没有对象类型作为参数的泛型方法作为参数传递的类型?

时间:2018-06-09 06:40:45

标签: c# generics inheritance reflection

我需要一个方法来查找一个名为泛型方法的参数的原始类型:

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 :(得分:3)

您根本不需要使用堆栈跟踪 - 只需使用typeof(T)

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

这将为第一个电话打印Foo,为第二个电话打印Foo2

这比上堆栈更简单,更可靠,更有效。