C# 我怎样才能到达;“对象”;在有反射的属性后面?

C# 我怎样才能到达;“对象”;在有反射的属性后面?,c#,.net,reflection,propertyinfo,C#,.net,Reflection,Propertyinfo,有没有办法通过反射获得属性背后的对象 我正在尝试管理一个属性的动态设置 例如: class Animal { public string Name {get;set;} public string Family {get;set;} } class Zoo { public Animal Lion {get;set;} public Animal Panda {get;set;} } class Test { public void SetLionNameWithRefl

有没有办法通过反射获得属性背后的对象

我正在尝试管理一个属性的动态设置

例如:

class Animal
{
  public string Name {get;set;}
  public string Family {get;set;}
}

class Zoo
{
 public Animal Lion {get;set;}
 public Animal Panda {get;set;}
}


class Test
{
   public void SetLionNameWithReflection()
  {

    Zoo londonZoo = new Zoo();
    Type zooType = typeof(Zoo);
    PropertyInfo lionProperty = zooType.GetProperty("Lion");

    // Now what to write here so that I can manage to set Lion's name to Kaspar?
    // (to manage this by reflection Lion.Name = "Kaspar");

  }

}
我应该在上面的评论部分添加哪些行


谢谢

不,您不能使用反射来最终获取任意属性后面的对象。很大程度上是因为不能保证每个属性都绑定到一个对象。它可以很容易地成为一个计算值

public class Student {
  public string m_firstName;
  public string m_lastName;

  public string FullName {
    get { return String.Format("{0} {1}", m_firstName, m_lastName); }
  }
}
在这种情况下,属性
FullName
生成一个计算值,并且没有单个支持对象


不过,您列出的案例是针对自动属性的。可能有一种方法可以挖掘字段,并使用名称匹配的形式来获取支持给定自动属性的名称。但是,这样的解决方案对于版本控制来说是脆弱的,当然不推荐使用。

不,您不能使用反射来最终获得任意属性后面的对象。很大程度上是因为不能保证每个属性都绑定到一个对象。它可以很容易地成为一个计算值

public class Student {
  public string m_firstName;
  public string m_lastName;

  public string FullName {
    get { return String.Format("{0} {1}", m_firstName, m_lastName); }
  }
}
在这种情况下,属性
FullName
生成一个计算值,并且没有单个支持对象


不过,您列出的案例是针对自动属性的。可能有一种方法可以挖掘字段,并使用名称匹配的形式来获取支持给定自动属性的名称。但是,这样的解决方案对于版本控制来说是脆弱的,当然不推荐使用。

属性不一定“后面”有对象

它由两个函数定义,
get
set
,它们可以执行任何您想要的操作,并且不一定返回对象的值


您所使用的只是一个语法糖,使属性更容易包装成员。

属性不一定“后面”有对象

它由两个函数定义,
get
set
,它们可以执行任何您想要的操作,并且不一定返回对象的值


您所使用的只是一个语法糖,使属性更容易包装成员。

能否向动物对象添加一个重载构造函数,允许您传入动物名称,如下所示:

londonZoo.GetProperty("Lion").SetValue(londonZoo, new Lion("Kaspar"), null); 

你能给你的动物对象添加一个重载构造函数吗?这样你就可以输入动物的名字了,如下所示:

londonZoo.GetProperty("Lion").SetValue(londonZoo, new Lion("Kaspar"), null); 

我不认为你真的需要知道财产背后的对象。使用该方法将其值设置为“Kaspar”:

编辑-根据dlev的评论,它应该是这样的:

Lion kaspar = new Lion { Name="Kaspar" };
zooType.SetValue(londonZoo, kaspar, null);

我不认为你真的需要知道财产背后的对象。使用该方法将其值设置为“Kaspar”:

编辑-根据dlev的评论,它应该是这样的:

Lion kaspar = new Lion { Name="Kaspar" };
zooType.SetValue(londonZoo, kaspar, null);

首先,您需要创建lion:

var lion = Activator.CreateInstance(lionProperty.PropertyType);
PropertyInfo property = lion.GetType().GetProperty("Name", 
    BindingFlags.Public | BindingFlags.Instance);
然后需要设置动物园的狮子属性:

lionProperty.SetValue(londonZoo, lion, null);
然后,您可以获得lion的Name属性:

var lion = Activator.CreateInstance(lionProperty.PropertyType);
PropertyInfo property = lion.GetType().GetProperty("Name", 
    BindingFlags.Public | BindingFlags.Instance);
然后可以设置其名称:

if (property != null && property.CanWrite)
{
    property.SetValue(lion, "Kaspar", null);
}

首先,您需要创建lion:

var lion = Activator.CreateInstance(lionProperty.PropertyType);
PropertyInfo property = lion.GetType().GetProperty("Name", 
    BindingFlags.Public | BindingFlags.Instance);
然后需要设置动物园的狮子属性:

lionProperty.SetValue(londonZoo, lion, null);
然后,您可以获得lion的Name属性:

var lion = Activator.CreateInstance(lionProperty.PropertyType);
PropertyInfo property = lion.GetType().GetProperty("Name", 
    BindingFlags.Public | BindingFlags.Instance);
然后可以设置其名称:

if (property != null && property.CanWrite)
{
    property.SetValue(lion, "Kaspar", null);
}

根据他给出的例子,他说要通过反射Lion.Name=“Kaspar”来管理这个,所以我认为他实际上不想进入私有字段,只需要使用属性的setter。尽管我可能错了。@Chris从文章的标题中可以看出,尽管我假设他想要的是真正的支持对象。这就是我解释“到达一处房产后面的物体”的方式至少,我明白你为什么这么回答了。我只是觉得,基于这个问题,他可能有一个垃圾头衔。自从我发表评论以来,尽管我已经看到其他人按照这些思路给出了答案,所以我的评论其实不再重要了。:)根据他给出的例子,他说要通过反射Lion.Name=“Kaspar”来管理这个,所以我认为他实际上不想进入私有字段,只需要使用属性的setter。尽管我可能错了。@Chris从文章的标题中可以看出,尽管我假设他想要的是真正的支持对象。这就是我解释“到达一处房产后面的物体”的方式至少,我明白你为什么这么回答了。我只是觉得,基于这个问题,他可能有一个垃圾头衔。自从我发表评论以来,尽管我已经看到其他人按照这些思路给出了答案,所以我的评论其实不再重要了。:)
zooType
是一个
Type
对象;您需要在
londonZoo
上设置该值。不过,这也不行,因为您不能将
字符串
分配给
动物
类型的属性。哦,我现在明白了。稍等片刻。
zooType
是一个
Type
对象;您需要在
londonZoo
上设置该值。不过,这也不行,因为您不能将
字符串
分配给
动物
类型的属性。哦,我现在明白了。稍等片刻。
zooType
是一个
Type
对象;您需要在
londonZoo
上设置该值。但是,这也不行,因为您不能将
字符串
分配给
动物
类型的属性
zooType
类型
对象;您需要在
londonZoo
上设置该值。但是,这也不起作用,因为您不能将
字符串
分配给
类型为Animal
的属性。