获取通用方法参数的运行时类型

时间:2019-08-12 22:14:36

标签: c# reflection

我想要一个带有随机类型参数的通用方法。

T的实例应该是具有某些属性的模型,所以我希望收集实例的所有公共属性。

另外,我想为模型提供一个InterfaceSuperclass,并能够在其上使用其他继承性东西。

问题在于,以typeof(T)SuperClass形式传递的模型的Interface结果显然没有有关子类的信息。

public interface ISomeInterface { int IProperty { get; }  }

public class SomeClass : ISomeInterface 
{ 
    public int ClassProperty { get; set; } //I need this too

    public int IProperty { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var v = (ISomeInterface)new SomeClass();

        TestMethod(v);

        Console.ReadKey();
    }

    static void TestMethod<T>(T value) where T : ISomeInterface
    {
        var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var p in props)
        {
            Console.WriteLine(p.Name);
        }
    }
}

输出将仅为IProperty,而ClassProperty已丢失。

我不能保证将来总是会像子类型一样显式地传递值。

在这种情况下,即使对于空引用,是否有任何方法可以在不使用*.GetType()的情况下获取实例的运行时类型?

1 个答案:

答案 0 :(得分:0)

使用GetType代替typeoftypeof关键字在编译时解析,并且取决于变量的类型。 GetType()在运行时解析,并取决于传递的对象的实际类型。

static void TestMethod<T>(T value) where T : ISomeInterface
{
    var props1 = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (var p in props1)
    {
        Console.WriteLine("Using typeof(T): {0}", p.Name);
    }
    var props2 = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
    foreach (var p in props2)
    {
        Console.WriteLine("Using value.GetType(): {0}", p.Name);
    }
}

输出:

Using typeof(T): IProperty
Using value.GetType(): ClassProperty
Using value.GetType(): IProperty

请参见DotNetFiddle

上的示例

另请参阅What is the difference between GetType() and typeof()?