通过反射区分类属性类型

时间:2014-01-26 12:29:37

标签: c# oop reflection

我有一个Rectangle类

public class Rectangle : Base, IRectangle
{
    public IDimension dimension { get; set; }
    public Position position { get; set; }
    public String color { get; set; }
    public int ID { get; set; }

    public override String ToString()
    {
        return base.ToString(this);
    }
}

有没有办法区分在Rectangle类上定义的属性的反射类型?

我如何理解ID是结构还是维度是接口? String和Position都是类,但String是在类中构建的,Position是Custom类。

3 个答案:

答案 0 :(得分:4)

您可以使用此属性:

typeof(T).IsPrimitive

检查类型是原始类型还是非原始类型

这一个:

typeof(T).IsInterface

检查类型是否为接口。

这是你检查类型是否为结构的方式:

typeof(T).IsValueType

如果您真正只关注“纯粹”结构(通常不只是值类型),那么:

typeof(T).IsValueType && !typeof(T).IsEnum;

答案 1 :(得分:3)

var prop = typeof(Rectangle).GetProperty("ID");
if(prop.PropertyType.IsValueType)
{ 
   ..
}

prop = typeof(Rectangle).GetProperty("dimension");
if(prop.PropertyType.IsInterface)
{
   ...
}

prop = typeof(Rectangle).GetProperty("color");
if(prop.PropertyType.IsClass)
{
   ...
}

您可能已经注意到Type类包含几个属性,您可以确定该类型是值类型,接口或类等。

要确定班级类型是built-in类型还是custom类型,我想您可以检查类型Assembly是否已从GAC (Global assembly cache)加载。它不是最好的解决方案,但我不知道另一种方式。

if(prop.PropertyType.Assembly.GlobalAssemblyCache)
{
   // built-in type..
}

答案 2 :(得分:1)

以上答案都很好。 的 BUT 如果你是可扩展的东西,你可以创建自己的自定义Custom Attributes并使用该类型的反射。

例如,您可以创建包含如何打印属性或如何验证属性的属性,使用反射来获取所有属性。

我们使用这种方式来创建协议解析器,其中每个属性我们定义协议中的顺序,长度和验证 - 但是再次 - 这对你来说可能是过度杀手