0

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

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

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

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

但我不能接受这个价格。

4

7 回答 7

5

您可以dynamic为此使用关键字。

dynamic b = l1.Items.GetItemAt(0); 
var price = b.Price;
于 2012-07-25T12:57:26.083 回答
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;
于 2012-07-25T12:57:42.467 回答
2

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

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);

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

于 2012-07-25T12:57:26.473 回答
2

一旦它进入object,您就无法将其抛出。你有两个选择:

  • 使用dynamic关键字来回避输入值。

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

就个人而言,我会上课:

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

因为您可能希望INotifyPropertyChanged实现数据绑定。

于 2012-07-25T12:58:33.527 回答
2

正如人们已经说过的,您可以使用 C# 中的动态关键字。另一种选择(如果您知道您的对象结构)是使用反射来获取相关属性并提取其值。

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;
于 2012-07-25T13:01:46.537 回答
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、描述等参数使用默认值。

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

于 2012-07-25T13:12:09.863 回答
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 属性。

于 2012-07-25T13:18:04.797 回答