从匿名对象获取值

时间:2012-07-25 12:54:04

标签: c# wpf listview anonymous-types

我有一个ListView(在WPF应用程序中),我以编程方式填写它:

l1.Items.Add(new
{
    AA = aa++,
    Description = descriptions[k],
    Shop = names[k + 2],
    Price = price
});

我想获取第一行和列价的值。我可以拿对象

object b = l1.Items.GetItemAt(0);

但是我不能接受这个价格。

7 个答案:

答案 0 :(得分:5)

您可以使用dynamic关键字。

dynamic b = l1.Items.GetItemAt(0); 
var price = b.Price;

答案 1 :(得分:4)

一旦匿名对象超出范围,您只能使用反射(不推荐),动态(这会使您失去编译时类型安全性)或其他一些黑客来访问其属性。

最干净的解决方案是使用非匿名对象,即定义一个类:

public class MyData {
    public int AA { get; set; }
    public string Description { get; set; }
    ...
}

...

l1.Items.Add(new MyData { AA = aa++, Description = descriptions[k], ...});

...

MyData b = (MyData) l1.Items.GetItemAt(0);
int aaValueOfB = b.AA;

答案 2 :(得分:2)

一旦进入object,就无法将其抛弃。您有两种选择:

  • 使用dynamic关键字输出值。

    dynamic d = l1.Items.GetItemAt(0);
    var price = d.Price;
    
  • 使用实际的类而不是匿名类型。

就个人而言,我会上课:

public class ItemsModel
{
    // Define the properties, etc.
}

因为您可能希望实现INotifyPropertyChanged以便进行数据绑定。

答案 3 :(得分:1)

您可以使用c#4中的dynamic功能,如下所示:

dynamic item = l1.Items.GetItemAt(0);
double price = item.Price;

你也可以使用反射(无论如何动态使用反射):

object item = l1.Items.GetItemAt(0);
Type t = item.GetType();
PropertyInfo pi = item.GetProperty("Price");
object price = pi.GetValue(item, null);

或者,如果在应用程序中有意义,只需将其声明为常规类,并将其用作此类。

答案 4 :(得分:1)

正如大家们已经说过的那样,你可以使用C#中的dynamic关键字。 另一个选项(如果您知道对象结构)使用反射来获取相关属性并提取其值。

List<object> collection = new List<object>
{
    new { Age1 = 1, Name = "Mr. Someone" } 
};            

// you can use reflection
object anonymous = collection.First();
var parameterInfo = anonymous.GetType().GetProperty("Name");
string name1 = (string)parameterInfo.GetValue(anonymous, null);

// another way
dynamic dynamicObject = collection.First();
string name2 dynamicObject.Name;

答案 5 :(得分:0)

试试这个:

private static T GetAnonType<T>(T type, object obj)
        {
            return (T)obj;
        }

Object obj= l1.Items.GetItemAt(0);

var info = GetAnonType(new { AA = aa++, Description = descriptions[k], Shop = names[k + 2], Price = price},obj);

使用AA,Description等参数的默认值。

然后你可以使用,info.AA, info.Price等。

答案 6 :(得分:0)

我是匿名类型的新手,但您可能需要将对象强制转换为该类型:

private static T CastTo<T>(this Object x, T targetType)
{
    return (T)x;
}
...
var tmp = new { AA = 0, Description = "", Shop = "", Price = 0.0}
tmp = l1.Items.GetItemAt(0).CastTo(tmp);
string price= "Price = " + tmp.Price;

确保使用正确的类型初始化tmp属性。