如何读取动态对象值

时间:2014-03-08 20:08:24

标签: c#

如何阅读propertyValues属性?

    public void Create(object propertyValues)
    {
        //How to read propertyValues attributes?
        //int code = propertyValues.Code;
        //string name = propertyValues.ProductName;
    }

    public void CallMethod()
    {
        Create(new
        {
            Code = 100,
            ProductName = "P1",
        });
    }

4 个答案:

答案 0 :(得分:3)

您需要将object参数更改为dynamic或创建您要传递的对象的强类型版本

public void Create(dynamic propertyValues)
{
    int code = propertyValues.Code;
    string name = propertyValues.ProductName;
}

public void Create(Order propertyValues)
{
    //How to read propertyValues attributes?
    var code = propertyValues.Code;
    var name = propertyValues.ProductName;
}

public class Order{
    public int Code {get; set;}
    public string ProductName {get; set;}
}

public void CallMethod()
{
    Create(new Order
    {
        Code = 100,
        ProductName = "P1",
    });
}

答案 1 :(得分:1)

使用dynamic

public void Create(dynamic propertyValues)
{
    int code = propertyValues.Code;
    string name = propertyValues.ProductName;
}

Reflection

public void Create(object obj)
{
    var type = obj.GetType();
    int code = (int)type.GetProperty("Code").GetValue(obj);
    string name = (string)type.GetProperty("ProductName").GetValue(obj);
}

答案 2 :(得分:0)

使用dynamic类型:

public void Create(dynamic propertyValues)
{
    //How to read propertyValues attributes?
    int code = propertyValues.Code;
    string name = propertyValues.ProductName;
}

答案 3 :(得分:0)

你可以使用这个技巧

public void Create(object propertyValues)
{
    // dummy value for the right type
    var o = new { Code = 0, ProductName = "P", };
    o = Cast(o, propertyValues);
    Console.WriteLine(o.ProductName);
}

public void CallMethod()
{
    Create(new
    {
        Code = 100,
        ProductName = "P1",
    });
}

private static T Cast<T>(T type, Object value)
{
    return (T)value;
}

技巧是在程序集内部,相同的匿名类型解析为相同的类型。

MSDN定义:

  

如果程序集中的两个或多个匿名对象初始值设定项指定了具有相同顺序且具有相同名称和类型的属性序列,则编译器会将对象视为相同类型的实例。它们共享相同的编译器生成的类型信息。