1

我正在创建一个方法,该方法将分析我创建的类的实例,检查该类上的每个属性的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,所以当递归调用方法时,Tis object

我可以获取Type当前对象的 ,但是如何将object返回的 from转换property.GetValue()为属性的实际类型?

4

1 回答 1

0

我建议不要把它作为一个通用方法,让它接受任何对象,并使用它GetType来获取类型(除非它是空的)。泛型在这里似乎并没有真正增加任何价值。

所以,去掉类型参数,使用obj.GetType(),如果对象为空就不要递归!

此外,(propertyType)obj)不会工作,如果它会没有用。强制转换仅用于类型安全并确定(在编译时)如何与对象交互。对于 System.Reflection 没有任何区别。

public static bool ObjectHasStringData( this object obj )
{
    if( obj == null )
        return false;
    var properties = obj.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
    foreach (var property in properties)
     ...
}
于 2013-10-10T18:27:26.330 回答