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
的属性。