如何进行财产下钻?

时间:2009-10-21 14:36:28

标签: c# reflection class properties

我如何知道对象实例是另一个对象实例的属性还是子属性?

例如我有这个类结构:

public class Car
{
      public Manufacturer Manufacturer {get;set;}
}

public class Manufacturer
{
      public List<Supplier> {get;set;}
}

public class Supplier
{
      string SupplierName {get;set;}
}

我只有两个实例,Car和SupplierName;在Reflection中使用PropertyInfo,如何实现

等方法
bool IsPropertyOrSubPropertyOf(object ObjectInstance, object TargetObejectInstance)

用作

IsPropertyOrSubPropertyOf(SupplierNameInstance, CarInstance)

如果CarInstance的Property Manufacturer有一个具有SupplierName SupplierNameInstance的供应商,则此方法将返回true

2 个答案:

答案 0 :(得分:2)

您不应该对您描述的特定示例使用反射:

bool IsPropertyOrSubPropertyOf(Supplier supplierInstance, Car carInstance)
{
    return carInstance.Manufacturer.Suppliers.Contains(supplierInstance);
}

(顺便说一句,你错过了List<Supplier>课程中Manufacturer属性的名称。我假设它在我上面的代码中实际上被称为Suppliers。)< / p>

答案 1 :(得分:2)

这是否符合您的要求?对不起,如果它不是最干净的 - 你可能也想在那里添加一些空检查。

private bool IsPropertyOrSubPropertyOf(Object Owner, Object LookFor)
{

    if (Owner.Equals(LookFor))
    {
        // is it a property if they are the same?
        // may need a enum rather than bool
        return true;
    }

    PropertyInfo[] Properties = Owner.GetType().GetProperties();

    foreach (PropertyInfo pInfo in Properties)
    {
        var Value = pInfo.GetValue(Owner, null);

        if (typeof(IEnumerable).IsAssignableFrom(Value.GetType()))
        {
            // Becomes more complicated if it can be a collection of collections
            foreach (Object O in (IEnumerable)Value)
            {
                if (IsPropertyOrSubPropertyOf(O, LookFor))
                    return true;
            }
        }
        else
        {
            if (IsPropertyOrSubPropertyOf(Value, LookFor))
            {
                return true;
            }
        }

    }
    return false;
}

修改:我刚注意到如果LookForIEnumerable,那么您最终可能会遇到问题,请将其留给您进行整理;)