如何通过名称获取实体的实体属性

4

在Person类中,我与Position类有关系,而Position类与PositionTitle类有关系,PositionTitle类有一个名为Title的属性。

public class Person
{
  public position Position{get;set;}
  public string Name{get;set;}
  public DateTime BirthDate{get;set;}
  public bool IsAdmin{get;set;}
  public int Age{get;set;}
}

public class position  
{
  public positionTitle PositionTitle{get;set;}
  public bool IsSystem{get;set;}
}

public class PositionTitle
{
  public string Title{get;set;}
}

我有一个字符串"Person.Position.PositionTitle.Title",如何使用这个字符串获取person的属性?编辑:我应该补充一些内容,我要获取所有person的属性,直到获取到系统类型为止。我的意思是,我想把这些属性作为字符串{ Name,Age,IsAdmin,BirthDate,IsSystem,Title}。我该怎么办?编辑2:还有一个问题,Position本身可以与Person有关系,如果我获取person的属性并递归地获取那些与person有关系的类的属性,将会出现无休止的循环,因为Person有一个Position,而Position又有一个Person。

PositionTitle 是什么,它的问题在哪里? - V4Vendetta
你的示例中有两个Person类... - marto
这段代码看起来有点混乱。你好像声明了两次PersonClass,并且每个都有一个position。你能否澄清一下,并说明你具体在问什么?因为我不太确定我是否理解你的意思。 - NotJarvis
正如其他人所说,您的问题表述非常不清楚。尽管从您的问题中可以看出,您最有可能正在寻找String.Split()函数。 - ub1k
这个 应该添加某些东西,我会获取到人的所有属性直到得到系统类型 是什么意思? - V4Vendetta
这意味着我想要访问以下属性:名称,年龄,是否管理员,出生日期,是否为系统属性,标题。 - Adrakadabra
1个回答

5
基本上,您需要通过“.”拆分字符串,然后循环遍历每个子字符串,使用反射获取当前实例的属性。然后将该实例设置为刚刚获得的属性。
这样您就能得到所需的属性。
    /// <summary>
    /// Gets an object property's value, recursively traversing it's properties if needed.
    /// </summary>
    /// <param name="FrameObject">The object.</param>
    /// <param name="PropertyString">The object property string.
    /// Can be the property of a property. e.g. Position.X</param>
    /// <returns>The value of this object's property.</returns>
    private object GetObjectPropertyValue(Object FrameObject, string PropertyString)
    {
        object Result = FrameObject;

        string[] Properties = PropertyString.Split('.');

        foreach (var Property in Properties)
        {
            Result = Result.GetType().GetProperty(Property).GetValue(Result, null);
        }

        return Result;
    }

免责声明:这个方法适用于我的使用,但要注意Null引用等问题!


如果没有双向关系,它可能会工作。人拥有一个职位,职位也拥有一个人,这样就会产生一个无限循环。 - Adrakadabra
@Adrakadabra,试试吧。它仍然可以工作,因为您提供的字符串不会是无限的,即它只会有Person.Position.Person.Position.... 几次。 - George Duckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接