まず、これが以前に尋ねられた場合は申し訳ありません。私はかなり包括的な検索を行いましたが、それとまったく同じものは見つかりませんでしたが、何かを見落としている可能性があります.
そして今、質問に: リフレクションを介してコンストラクターを呼び出そうとしていますが、運がありません。基本的に、複製したいオブジェクトがあるので、その型のコピー コンストラクターを検索し、それを呼び出します。ここに私が持っているものがあります:
public Object clone(Object toClone) {
MethodBase copyConstructor = type.GetConstructor(
new Type[] { toClone.GetType() });
return method.Invoke(toClone, new object[] { toClone }); //<-- doesn't work
}
上記のメソッドを次のように呼び出します。
List<int> list = new List<int>(new int[] { 0, 1, 2 });
List<int> clone = (List<int>) clone(list);
ここで、私が使用している呼び出しメソッドが の呼び出しであることに注意してMethodBase
ください。ConstructorInfo
次のように呼び出された場合に機能する呼び出しメソッドを提供します。
return ((ConstructorInfo) method).Invoke(new object[] { toClone });
ただし、 のメソッドを使用したいMethodBase
のは、実際にはコピー コンストラクターを辞書に格納するたびに検索するのではなく、辞書にメソッドとコンストラクターの両方が含まれているため、Dictionary<MethodBase>
ではなくDictionary<ConstructorInfo>
です。もちろんConstructorInfo
、上記のようにキャストすることもできますが、キャストを避けてMethodBase
メソッドを直接使用したいと思います。正しいパラメータがわかりません。
何か助けはありますか?本当にありがとう。
編集
ベンジャミン、
あなたの提案に感謝します。私は実際にあなたが2番目の編集で提案したことを正確に行っていました.
class ClonerMethod {
public MethodBase method;
public bool isConstructor;
...
public Object invoke(Object toClone) {
return isConstructor ?
((ConstructorInfo) method).Invoke(new object[] { toClone }) : //<-- I wanted to avoid this cast
method.Invoke(toClone, null);
}
}
そして、辞書で見つけたものについてClonerMethod
'sを呼び出しました。invoke
私が探していた答えは、ConstructorInfo
usingMethodBase
のInvoke
メソッドで Invoke を呼び出す方法だけだったので、それらすべてを処理するコードを追加しませんでした。読んでください。しかし、私はあなたの使い方がFunc<,>
ずっと良いと思うので、そちらに切り替えます。また、Clone
メソッドをジェネリックにするのは良い追加ですが、私の場合、呼び出し元はオブジェクトの型を知らないので、代わりに非ジェネリックのままにします。
私は について知らなかったしFunc<,>
、忘れていたラムダ演算子について知っていれば(以前はこのようなものは本当に必要ではなかった)、実際にあなたの答えから多くのことを学びました。私はいつも新しいことを学ぶのが大好きで、これは将来とても役に立ちます。どうもありがとうございました! :)