我有一个数据对象,它有许多不同的List属性。我想使用单个AddObject
命令,而不是为每个List创建一个不同的命令,因此想出了以下代码。
您看到使用这种方法的任何缺点吗?我认为性能可能会变慢,但是实际上我没有看到差异。
public MyViewModel()
{
_addCommand = new RelayCommand<IEnumerable>(AddGenericObject);
// Old code.... defines an Add command per list
// _addAddressCommand = new RelayCommand(() => AddObject<Address>(AddressList));
// _addPhoneCommand = new RelayCommand(() => AddObject<Phone>(PhoneList));
// ... etc
}
private void AddGenericObject(IEnumerable list)
{
// Find Add Method
var addMethod = this.GetType()
.GetMethod("AddObject", BindingFlags.NonPublic | BindingFlags.Instance);
// Created Generic Add Method
Type genericType = list.GetType().GetGenericArguments()[0];
var genericAddMethod = addMethod.MakeGenericMethod(genericType);
// Invoke Method
genericAddMethod.Invoke(this, new object[] { list });
}
private void AddObject<T>(EntityCollection<T> list)
where T : EntityObject, new()
{
var newItem = new T();
list.Add(newItem);
}
它可以在XAML中这样使用:
<Button Content="New Address"
Command="{Binding AddCommand}"
CommandParameter="{Binding AddressList}" />
<Button Content="New Phone"
Command="{Binding AddCommand}"
CommandParameter="{Binding PhoneList}" />
ICommand
不像事件那样给你源,否则你可以通过附加属性指定目标类型。我喜欢附加属性。它们让我感到快乐,就像小狗的亲吻一样。 - user1228