查看类的属性是否有可能检测它们中的任何一个是否是引用类型。
以下面为例:
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类型匹配,只需复制类属性。
答案 0 :(得分:40)
嗯,听起来你可能试图检测值类型和引用类型之间的差异。您可以使用Type.IsValueType
找到它...但请注意,值类型也可以轻松拥有属性。 (例如,考虑DateTime
。)此外,您可能希望视为“非对象”的某些类型是引用类型 - string
是一个主要示例。
另一种选择是使用Type.IsPrimitive
- 那你在寻找什么?如果是这样,您应该知道decimal
,DateTime
和string
不是原始类型。
如果你能够完全描述 是什么使得某种类型成为你思考方式的“对象”(或者更确切地说,无论如何都会使你的类型在你的类型中产生语义上的差异)。我怀疑你目前没有一套非常明确的标准 - 提出这些标准也可能会澄清你当前任务的其他方面。
答案 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中的所有对象都是对象; int
和bool
是对象。如果您指的是引用类型,而不是值类型,则可以执行以下操作:
foreach (PropertyInfo pi in typeof(Client).GetProperties()) {
if (pi.PropertyType.IsClass) {
// reference type
// DoMyFunkyStuff
}
}
答案 4 :(得分:1)
答案 5 :(得分:1)
检查类型是否为字符串,并检查其是否为类。
public static bool IsNonStringClass(this Type type)
{
if (type == null || type == typeof(string))
return false;
return typeof(Type).IsClass;
}