我正在创建一个方法,该方法将分析我创建的类的实例,检查该类上的每个属性的string
类型,然后检查这些string
属性是否为null
空。
代码:
public class RootClass
{
public string RootString1 { get; set; }
public string RootString2 { get; set; }
public int RootInt1 { get; set; }
public Level1ChildClass1 RootLevel1ChildClass11 { get; set; }
public Level1ChildClass1 RootLevel1ChildClass12 { get; set; }
public Level1ChildClass2 RootLevel1ChildClass21 { get; set; }
}
public class Level1ChildClass1
{
public string Level1String1 { get; set; }
public string Level1String2 { get; set; }
public int Level1Int1 { get; set; }
}
public class Level1ChildClass2
{
public string Level1String1 { get; set; }
public string Level1String2 { get; set; }
public int Level1Int1 { get; set; }
public Level2ChildClass1 Level1Level2ChildClass11 { get; set; }
public Level2ChildClass1 Level1Level2ChildClass12 { get; set; }
public Level2ChildClass2 Level1Level2ChildClass22 { get; set; }
}
public class Level2ChildClass1
{
public string Level2String1 { get; set; }
public string Level2String2 { get; set; }
public int Level2Int1 { get; set; }
}
public class Level2ChildClass2
{
public string Level2String1 { get; set; }
public string Level2String2 { get; set; }
public int Level2Int1 { get; set; }
}
并非类上的所有属性都是字符串,其中一些是其他类的实例,它们有自己的属性,也需要以同样的方式分析。基本上,true
如果任何属性是在 RootClass 或类的子级别上的任何位置具有值的字符串(例如,如果RootLevel1ChildClass11
具有具有值的字符串属性),则该方法将返回。
这是我到目前为止所拥有的:
public static bool ObjectHasStringData<T>(this T obj)
{
var properties = typeof(T).GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var property in properties)
{
Type propertyType = property.PropertyType;
if (propertyType == typeof(string))
{
try
{
if (!String.IsNullOrEmpty(property.GetValue(obj, null) as string))
return true;
}
catch (NullReferenceException) { } // we want to ignore NullReferenceExceptions
}
else if (!propertyType.IsValueType)
{
try
{
if (ObjectHasStringData(property.GetValue(obj, null)))
return true;
}
catch (NullReferenceException) { } // we want to ignore NullReferenceExceptions
}
}
return false;
}
这在第一层(所以任何string
在 内RootClass
)都很好用,但是一旦我开始if (ObjectHasStringData(property.GetValue(obj, null)))
在行上递归使用它,返回值property.GetValue()
is object
,所以当递归调用方法时,T
is object
。
我可以获取Type
当前对象的 ,但是如何将object
返回的 from转换property.GetValue()
为属性的实际类型?