如何在C#中迭代匿名对象的属性?

Tom*_*han 53 c# iteration properties anonymous-types

我想将一个匿名对象作为方法的参数,然后迭代其属性以将每个属性/值添加到动态ExpandoObject.

所以我需要的是去

new { Prop1 = "first value", Prop2 = SomeObjectInstance, Prop3 = 1234 }
Run Code Online (Sandbox Code Playgroud)

了解每个属性的名称和值,并能够将它们添加到ExpandoObject.

我该如何做到这一点?

旁注:这将在我的许多单元测试中完成(我用它来重构设置中的大量垃圾),因此性能在某种程度上是相关的.我不太了解反思,肯定地说,但从我所知道的那里,它的性能非常重,所以如果有可能我宁愿避免它......

后续问题: 正如我所说,我将这个匿名对象作为方法的参数.我应该在方法的签名中使用什么数据类型?如果我使用,object是否所有房产都可用?

BFr*_*ree 69

foreach(var prop in myVar.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
   Console.WriteLine("Name: {0}, Value: {1}",prop.Name, prop.GetValue(myVar,null));
}
Run Code Online (Sandbox Code Playgroud)

  • 我解决了后续问题的问题:`(MyExpandoObject as ICollection <KeyValuePair <string,object >>).添加(...)`做了诀窍.谢谢! (2认同)

Jon*_*att 7

反映匿名对象以获取其属性名称和值,然后利用ExpandoObject实际上是一个字典来填充它.这是一个例子,表示为单元测试:

    [TestMethod]
    public void ShouldBeAbleToConvertAnAnonymousObjectToAnExpandoObject()
    {
        var additionalViewData = new {id = "myControlId", css = "hide well"};
        dynamic result = new ExpandoObject();
        var dict = (IDictionary<string, object>)result;
        foreach (PropertyInfo propertyInfo in additionalViewData.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            dict[propertyInfo.Name] = propertyInfo.GetValue(additionalViewData, null);
        }
        Assert.AreEqual(result.id, "myControlId");
        Assert.AreEqual(result.css, "hide well");
    }
Run Code Online (Sandbox Code Playgroud)