我有一个ListView(在WPF应用程序中),我以编程方式填写它:
l1.Items.Add(new
{
AA = aa++,
Description = descriptions[k],
Shop = names[k + 2],
Price = price
});
我想获取第一行和列价的值。我可以拿对象
object b = l1.Items.GetItemAt(0);
但是我不能接受这个价格。
答案 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属性。