この質問の要素は以前は聞いたことがありますが、回答を見つけるのが難しいです。 (免責事項:これは関連していますが、私が最近尋ねた質問とは別です)。汎用オブジェクトパラメータの実際のタイプを取得する
私はこのような方法があります:
public static void Method<T>(MethodInfo m, T value)
{
Type memberType = m.GetValueType();
if (memberType.IsAssignableFrom(typeof(List<T>))
{
object memberValue = Activator.CreateInstance(memberType);
((List<T>)memberValue).Add(value);
}
}
これは、私がこのようにそれを呼び出したときに正常に動作します:しかし、私はジェネリック型を使用してこのメソッドを呼び出す必要が
string s = "blah";
Method(memberInfo, s);
ので、私メソッド< Tの値 ':「このようにそれを呼び出すmは今
Type valueType = someType;
object passValue = someMethod.MakeGenericMethod(new Type[] { valueType }).Invoke(this, new object[] { });
/* Call my original method */
Method(memberInfo, passValue);
、インテリセンスは、知っている'> IどのタイプのvalueType(「FooObject」など)であってもかまいません。しかし、 'T'はオブジェクトです。つまり、リスト<FooObject>はではなく、リスト< T>(リスト<オブジェクト>)からを割り当てることができます。
私は変数( 'passValue')にConvert.ChangeTypeを使用しようとしましたが、これはもう役に立ちませんでした。
タイプ変数のタイプに変数をキャストする方法がないので、どうすればこの問題を回避できますか?
どうやらIsAssignableFromに頼らず、これが機能するかどうかのより緩やかな型チェックを行うのが最善の解決策ですか?この問題は、 'T'が本当にmemberValueの要素型でない限り、memberValueを適切にキャストできないことがわかりません。
GetValueType()は、コード内の拡張メソッドです。しかし、コードを見ていなくても、メソッド 'Method'は何もしません...何か?私はあなたに改善された解決策を提供したいと思いますが、ここで何をしようとしているのか分かりません。 –
申し訳ありませんgetvaluetypeは、特定のMemberTypeに応じて特定のMemberInfoのFieldType/PropertyTypeを呼び出すメソッドです。メソッドは、リストを表すMemberInfoにオブジェクトを追加します(つまり、リストであるフィールドまたはプロパティ)。 –