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

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

以下面为例:

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是引用类型。 有没有办法检测到这个?

非常感谢,Kohan。

附录

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

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

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

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

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

 Client.GetType().IsClass 

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

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

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

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

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

 Id.GetType().IsValueType 

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

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

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