我的课就是这样,
public class Person : DynamicObject
{
public string Name { get; set; }
public string Address { get; set; }
Dictionary<string, object> dictionary = new Dictionary<string, object>();
public int Count
{
get
{
return dictionary.Count;
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name;
return dictionary.TryGetValue(name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
dictionary[binder.Name] = value;
return true;
}
public void AddProperty<TTValue>(string key, TTValue value = default(TTValue))
{
dictionary[key] = value;
}
public void AddProperty(string typeName, string key, object value = null)
{
Type type = Type.GetType(typeName);
dictionary[key] = Convert.ChangeType(value, type);
}
}
然后我从这个类创建对象并将其添加到列表
dynamic p = new Person();
p.Name = "john";
p.Address = "address1";
p.AddProperty<DateTime>("BirthDate", DateTime.Now);
p.AddProperty("System.String", "Weigth", "70 kg");
List<Person> lstPerson=new List<Person>();
lstPerson.Add(p);
在添加这样的几个人对象后,我使用绑定源将其绑定到数据网格视图。但是在绑定到网格视图后,我的动态创建的属性不会显示在网格中。
答案 0 :(得分:2)
当我有一个需要绑定到网格的通用对象列表时,我喜欢使用Linq select语句。
var dataSource = myList.Select(item=> new
{ Name = item.Key,
MainAddress = item.Address.First() });
grid.DataSource = dataSource;
grid.DataBind();
然后,您可以使用您定义的属性名来访问列。
答案 1 :(得分:1)
我敢打赌你的网格不支持动态类型。如果您绝对必须使用动态类型,则可能必须使用反射手动将列添加到网格中,或者自己指定它们。我的建议是重构你的代码以摆脱动态类型。在我看来,使用动态类型通常是一种代码气味(并不是说它们没有合法的用途,但我看到你做的事情也可以用匿名类型而不是动态来完成。)