多くの異なるListプロパティを持つデータオブジェクトがあります。それぞれのリストに対して異なるコマンドを作成するのではなく、単一のAddObject
コマンドを使用したいので、次のコードが思い浮かびました。Reflectionを使用してViewModelで汎用タイプのコマンドを作成する際の弱点は何ですか?
これを使用すると何か面白いことはありますか?私はパフォーマンスが遅くなるかもしれないと思ったが、正直なところ違いは見られなかった。
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}" />
以下のコメントが示唆するように、パフォーマンスが反射して大きな問題です。キャッシュ機能を使用して、リフレクションの結果をキャッシュに入れて、パフォーマンスをスピードアップしてください。 – Jethro
この文脈で大丈夫ですが、壊れやすいものです。リストが汎用ではない場合、または異なるタイプのインスタンスが含まれている場合はどうなりますか?明らかに、あなた自身のコードベース内で、あなたはそれを簡単に制御することができます。 ICommandはイベントのようなソースを提供していません。そうでなければ、添付されたプロパティを使ってターゲットタイプを指定することができます。私は添付のプロパティが大好きです。彼らは子犬のキスのように私を幸せにする。 – Will