检测class属性是否为引用类型

时间:2011-01-07 17:30:03

标签: c# class object properties

查看类的属性是否有可能检测它们中的任何一个是否是引用类型。

以下面为例:

public class Client
{
   public int Id { get; set; }
   public string Name { get; set; }
}

public class ProgrammeClient
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public IClient Client { get; set; }
}

ProgrammeClient: -
Id和IsActive是属性,但Client是引用类型。有没有办法检测到这个?

非常感谢, 钢钣。

附录

我问的原因是:我使用的映射器在匹配属性名称和复制值之前检查类型是否相同。我希望检测类并覆盖类型匹配,如果THEY类型匹配,只需复制类属性。

6 个答案:

答案 0 :(得分:40)

嗯,听起来你可能试图检测值类型和引用类型之间的差异。您可以使用Type.IsValueType找到它...但请注意,值类型也可以轻松拥有属性。 (例如,考虑DateTime。)此外,您可能希望视为“非对象”的某些类型是引用类型 - string是一个主要示例。

另一种选择是使用Type.IsPrimitive - 你在寻找什么?如果是这样,您应该知道decimalDateTimestring 不是原始类型。

如果你能够完全描述 是什么使得某种类型成为你思考方式的“对象”(或者更确切地说,无论如何都会使你的类型在你的类型中产生语义上的差异)。我怀疑你目前没有一套非常明确的标准 - 提出这些标准也可能会澄清你当前任务的其他方面。

答案 1 :(得分:13)

您可以使用一点反射来查看属性是值类型还是类类型。类可能就是“对象”的意思。 .NET中的所有类型都来自对象类型。

Client.GetType().IsClass

或者您可以遍历所有属性并查看哪些是复合

foreach(var p in ProgrammeClient.GetType().GetProperties())
{
     if(p.IsClass) Console.WriteLine("Found a class");
}

答案 2 :(得分:2)

您可以通过Reflection枚举属性,并检查它们:

bool ContainsOnlyValues() { 
    return typeof(ProgrammeClient).GetProperties().All(x => x.PropertyType.IsValueType);
}

答案 3 :(得分:1)

示例中的所有属性都返回对象,因为.NET中的所有对象都是对象; intbool是对象。如果您指的是引用类型,而不是值类型,则可以执行以下操作:

foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
    if (pi.PropertyType.IsClass) {
        // reference type
        // DoMyFunkyStuff
    }
}

答案 4 :(得分:1)

Type.IsvalueType属性可以揭示这一点。

Id.GetType().IsValueType

对于Id,这将是True,对于类

,则为false

答案 5 :(得分:1)

检查类型是否为字符串,并检查其是否为类。

        public static bool IsNonStringClass(this Type type)
        {
            if (type == null || type == typeof(string))
                return false;
            return typeof(Type).IsClass;
        }