[英]How to get all simple properties of an object in C#
我想知道如何獲得所有類型的對象,而不是指向另一個類。
例如,這將包括string,int,datetime等,但不包括指向集合或其他自定義類的指針
我有以下內容,但它似乎沒有返回字符串:
PropertyInfo[] properties = typeOfObject.GetProperties();
foreach (PropertyInfo property in properties.Where(p => !p.PropertyType.IsClass))
{
}
正如Leri所要求的那樣 - 我計划采用一個對象的原始副本,沒有集合/類等。因此它必須包含所有原始類型,字符串,日期時間和其他任何存在的類型。
因為String
是一個類,而不是像Int32
和Double
等結構
如果你想要的不是一個類,而是包括字符串,那就指定一下!
foreach (PropertyInfo property in
properties.Where(p => !p.PropertyType.IsClass
|| p.PropertyType == typeof(String)))
{
}
你的代碼也會給你所有的結構,它們本身可以包含對集合等的引用,所以它不會這樣做。
你最好的選擇可能是要求IsPrimitive(它給你int,short等),並添加你想要的任何其他已知類型,如string,DateTime等。
我決定在這里混合使用幾種解決方案。
首先,由於結構等問題,我決定保留Leri提到的允許類型列表。
其次,根據Luaan的評論,我已經寫了一個處理nullables的方法。
所以解決方案如下:
迭代屬性的代碼
foreach (PropertyInfo property in properties)
{
if (this.IsTypeASimpleType(property.PropertyType) &&
property.CanWrite)
{
}
}
然后是用於檢查類型是否正確的代碼
private bool IsTypeASimpleType(Type typeToCheck)
{
var typeCode = Type.GetTypeCode(this.GetUnderlyingType(typeToCheck));
switch (typeCode)
{
case TypeCode.Boolean:
case TypeCode.Byte:
case TypeCode.Char:
case TypeCode.DateTime:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.SByte:
case TypeCode.Single:
case TypeCode.String:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
return true;
default:
return false;
}
}
以及處理nullables的代碼
private Type GetUnderlyingType(Type typeToCheck)
{
if (typeToCheck.IsGenericType &&
typeToCheck.GetGenericTypeDefinition() == typeof(Nullable<>))
{
return Nullable.GetUnderlyingType(typeToCheck);
}
else
{
return typeToCheck;
}
}
現在,switch語句可能已被更改為允許類型的列表,但最終游戲將是相同的。
好的,有了你提煉的問題,更好的答案是:如果你能夠在一個變量上調用GetType(),那么它將返回一個對象,你可以反思該對象以獲得底層類型。 您還可以詢問該類型是否是某個其他現有類型的實例,這有助於確定運行時類型的安全性(“如果我將此實體視為Cat類型的對象,我的代碼會拋出異常嗎?”)
所以我認為你想要做的是調用GetType()。 然后,您可以使用返回的類型對象執行許多操作。 其中之一是測試完全匹配,例如這樣:“if(x.GetType()。Equals(typeof(int)))....
實際上有幾種方法可以做到並且所有這些方法都有效。 我剛剛做的完全匹配非常嚴格。 但請注意,您可以使用typeof(int)來獲取將成為int類型的真實基礎類型表示的Type對象,即使int是C#中的基類型,因此int類型的東西不是對象 - - 在運行時它由值表示,而不是由引用表示。 這是有效的,因為在編譯時解析了typeof()。
因此,我認為出於您的目的,這可能是您需要做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.