C# 我需要获取特定对象的值';s属性,但don';我不知道物体的类型
我有一个c#对象,我不知道这个对象的类型。(即对象o) 我知道这个对象有一个名为“ID”的int类型的成员 我想得到这个财产的价值,但我没有足够好的反射 我可以获取此对象的类型和成员:C# 我需要获取特定对象的值';s属性,但don';我不知道物体的类型,c#,reflection,C#,Reflection,我有一个c#对象,我不知道这个对象的类型。(即对象o) 我知道这个对象有一个名为“ID”的int类型的成员 我想得到这个财产的价值,但我没有足够好的反射 我可以获取此对象的类型和成员: Type type = obj.GetType(); System.Reflection.MemberInfo[] member = type.GetMember("ID"); …但不知道下一步该怎么办:-) 提前谢谢你的帮助 Mariusz您可以使用: Type type = obj.GetType(); P
Type type = obj.GetType();
System.Reflection.MemberInfo[] member = type.GetMember("ID");
…但不知道下一步该怎么办:-)
提前谢谢你的帮助
Mariusz您可以使用:
Type type = obj.GetType();
PropertyInfo property = type.GetProperty("ID");
int id = (int) property.GetValue(obj, null);
- 使用
,因为您知道它是一个属性,这使事情变得更简单PropertyInfo
- 调用以获取值,作为属性的目标传入
,对于索引器参数传入obj
(因为它是属性,而不是索引)null
- 将结果强制转换为
,因为您已经知道它将是int
int
dynamic
,这也很好,不过为了避免所有括号,我可能会这样写:
dynamic d = obj;
int id = d.ID;
(除非出于某种原因需要在单个表达式中使用它)。这是公共财产吗?因此,最简单的方法是使用
dynamic
int value = ((dynamic)obj).ID;
你会用C#4吗?在这种情况下,您可以使用dynamic
:
dynamic dyn = obj;
int id = dyn.ID;
您不应该将var用于
dyn.ID
。由于它是动态的,所以它将解析为对象
。您应该使用特定的类型(int
,正如OP所说)或动态。同样,使用动态的漂亮解决方案。谢谢,德里斯。似乎值得开始学习F#或一些函数式语言。如果函数世界中的一切都很酷,我不知道我还在这里做什么:-)@sllev:当你把任何动态对象或从动态对象中获得的对象放入var时,var的行为就像它是对象
。如果你使用的是c#4.0,那么动态将像其他人建议的那样工作。但是,当你说你不知道对象的类型时,你是说你永远不会知道对象的类型,还是说你只是不知道如何确定对象变量中存储的类型?编辑:您至少知道obj变量将包含的可能类型吗?就个人而言,如果你知道可能的类型,我不会使用动力学。在这种情况下,我将使用if/else if
逻辑。非常感谢您提供的所有答案。我很震惊你们所有人都是如此的乐于助人!!! 我没有得到什么好的答案。John提供的一个:int value=(int)property.GetValue(obj,null);这是我最初想要的,它工作得很好。再次感谢约翰。我必须提到,我已经跪在我的膝盖上,看到Jared使用dynamic的建议。它只是美丽而简单。再次感谢。oscilatingcretin-每次我拿到它的时候,它可能是不同类型的。我只知道它有两个特性:ID int和Name string,我对第一个很感兴趣。我可以使用dynamics,而且它看起来是一个最干净的解决方案。我认为很多.NET大师会对使用反射来解决类似问题产生轻微的反感。如果你正在寻找那种风格的功能,一定要选择dynamics。然而,我仍然好奇这种类型是否真的完全未知。很难相信你会将一个可怕的随机数目的不同对象传递给一个方法。好吧,不管你在我发我的邮件的同时发了你的邮件好吧,让我解释一下。我在win forms应用程序中使用ListBox控件。我得到一个IEnumerable对象数组,并使用DisplayMember、ValueMember和DataSource属性将它们绑定到控件。DisplayMember和ValueMamber始终相同(ID int和Name string),但整个对象因使用了什么查询(EF 4.0,存储库提供CRUD)而不同(更准确地说,是针对数据库中的哪个表执行查询)。UI和业务逻辑位于不同的层中。业务层不知道谁将使用结果,反之亦然。希望这能澄清。我记得你在一个播客(可能是.Net Rocks)上提到,人们会接受你的答案,因为你是JS:-)我也很受诱惑,我不得不说,因为你的答案太棒了。。。一如往常:-)但我希望你不会介意,这次德里斯的动态美将是唯一的。谢谢Mariusz@Mariusz:没问题-尽管Jared首先发布了动态方法:)
public class TestClass
{
public TestClass()
{
// defaults
this.IdField = 1;
this.IdProperty = 2;
}
public int IdField;
public int IdProperty { get; set; }
}
// here is an object obj and you don't know which its underlying type
object obj = new TestClass();
var idProperty = obj.GetType().GetProperty("IdProperty");
if (idProperty != null)
{
// retrieve it and then parse to int using int.TryParse()
var intValue = idProperty.GetValue(obj, null);
}
var idField = obj.GetType().GetField("IdField");
if (idField != null)
{
// retrieve it and then parse to int using int.TryParse()
var intValue = idField.GetValue(obj);
}