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

4im*_*ble 27 c# properties class object

是否可以在查看类的属性时检测它们中的任何一个是否为引用类型.

以下面为例:

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢,Kohan.

附录

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

Jon*_*eet 46

好吧,听起来您可能正试图检测值类型和引用类型之间的差异.您可以使用Type.IsValueType... 找到它,但请注意,值类型也很容易具有属性.(DateTime例如,考虑一下.)此外,您可能想要视为"非对象"的某些类型是引用类型 - 这string是一个主要的例子.

另一种选择是使用Type.IsPrimitive-就是那个你在找什么?如果是这样,你应该知道decimal,DateTimestring不是基本类型.

如果你能够准确地描述什么使一个类型成为你思考方式的"对象"(或者更确切地说,无论以何种方式使你的类型与你的类型有所不同).我怀疑你目前没有一套非常明确的标准 - 提出这些标准也可能很好地澄清你当前任务的其他方面.

  • 由于这是谷歌搜索最多的答案,我认为我们大多数人都同意找到一个解决方案来检查属性是否是对另一个(自己定义的)类的引用。检查这一点的最佳方法是什么? (2认同)

Jak*_*son 19

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

Client.GetType().IsClass
Run Code Online (Sandbox Code Playgroud)

或者你可以遍历所有属性,看看哪些是复合的

foreach(var p in ProgrammeClient.GetType().GetProperties())
{
     if(p.PropertyType.IsClass) Console.WriteLine("Found a class");
}
Run Code Online (Sandbox Code Playgroud)

  • 你需要`p.PropertyType.IsClass`,thecoop的答案. (5认同)
  • 对于“字符串”IsClass = true (2认同)

小智 5

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

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