2011-06-21 39 views
0

我的班级是这样的,绑定动态地从这个类创建属性网格

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

添加几个人对象后像这样我使用绑定源将它绑定到datagrid视图。但绑定到网格视图后,我的动态创建的属性不会显示在网格中。

回答

2

当我有一个需要绑定到网格的通用对象列表时,我喜欢使用Linq select语句。

var dataSource = myList.Select(item=> new 
       { Name = item.Key, 
       MainAddress = item.Address.First() }); 
grid.DataSource = dataSource; 
grid.DataBind(); 

然后,您可以使用您定义的属性名称来访问列。

1

我敢打赌,你的网格不支持动态类型。如果您绝对必须为此使用动态类型,则可能必须使用反射来手动将列添加到网格中,或者只需自己指定它们即可。我的建议是重构你的代码来摆脱动态类型。在我看来,使用动态类型通常是一种代码味道(并不是说它们没有合法的用途,但我看到你做的事情可以用匿名类型而不是动态的方式来完成)。