繁体   English   中英

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

[英]Get the runtime type of a generic method parameter

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

T的实例应该是具有一些属性的模型,所以我想收集一个实例的所有公共属性。

此外,我希望为模型拥有一个InterfaceSuperclass ,并且也能够在它们上使用其他继承内容。

问题是已作为SuperClassInterface明确传递的模型的typeof(T)结果没有关于子类的信息。

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);
        }
    }
}

输出将仅为IPropertyClassProperty已被遗漏。

我不能确定将来总是像子类型那样明确传递值。

在这种情况下,即使对于空引用,有没有办法在不使用*.GetType()的情况下获取实例的运行时类型?

使用GetType而不是typeof typeof关键字在编译时解析,取决于变量的类型; 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上的示例

另请参阅GetType() 和 typeof() 之间有什么区别?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM