我有一个 ListView(在 WPF 应用程序中),我以编程方式填充它:
l1.Items.Add(new
{
AA = aa++,
Description = descriptions[k],
Shop = names[k + 2],
Price = price
});
我想取第一行和列价格的值。我可以拿走对象
object b = l1.Items.GetItemAt(0);
但我不能接受这个价格。
我有一个 ListView(在 WPF 应用程序中),我以编程方式填充它:
l1.Items.Add(new
{
AA = aa++,
Description = descriptions[k],
Shop = names[k + 2],
Price = price
});
我想取第一行和列价格的值。我可以拿走对象
object b = l1.Items.GetItemAt(0);
但我不能接受这个价格。
您可以dynamic
为此使用关键字。
dynamic b = l1.Items.GetItemAt(0);
var price = b.Price;
一旦匿名对象超出范围,您只能使用反射(不推荐)、动态(这会使您失去编译时类型安全)或其他一些技巧来访问其属性。
最干净的解决方案是使用非匿名对象,即定义一个类:
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;
您可以使用dynamic
c# 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);
或者,如果它在应用程序中有意义,只需将其声明为常规类,并照此使用。
一旦它进入object
,您就无法将其抛出。你有两个选择:
使用dynamic
关键字来回避输入值。
dynamic d = l1.Items.GetItemAt(0);
var price = d.Price;
使用实际类而不是匿名类型。
就个人而言,我会上课:
public class ItemsModel
{
// Define the properties, etc.
}
因为您可能希望INotifyPropertyChanged
实现数据绑定。
正如人们已经说过的,您可以使用 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;
尝试这个:
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
等。
我是匿名类型的新手,但您可能需要将对象转换为该类型:
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 属性。