Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我需要获取特定对象的值';s属性,但don';我不知道物体的类型_C#_Reflection - Fatal编程技术网

C# 我需要获取特定对象的值';s属性,但don';我不知道物体的类型

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

我有一个c#对象,我不知道这个对象的类型。(即对象o) 我知道这个对象有一个名为“ID”的int类型的成员

我想得到这个财产的价值,但我没有足够好的反射

我可以获取此对象的类型和成员:

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
如果您使用的是C#4和.NET 4,Jared建议使用
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);
}