私は.netで小さなシリアル化ライブラリを書いています。目標は、XmlSerialize に代わるものを用意することですが、構成が簡単で、モデルを属性で台無しにすることはありません。
私が直面している問題は ICollection<T>
、モデルのトラバース中に見つけたそれぞれの型が必要だということです。素朴なアプローチは次のとおりです。
var theType=myModel.GetType().GetGenericArguments()[0];
ICollection<T>
ただし、特定の Tから派生するクラスには役立ちません。
public class MyClass:A,ICollection<B>{}
リフレクションでインターフェースを取得してみました
var iCollectionInterface =
o.GetType().GetInterfaces()
.Where(i => i.IsGenericType)
.Select(i => i.GetGenericTypeDefinition())
.FirstOrDefault(i => i == typeof(ICollection<>));
しかし、それはインターフェイスの定義のみを記述し、その使用法を記述していないからではありませんiCollectionInterface.GetGenericArguments()[0]
。T
B
何か案は?私もそれが必要ですIDictionary<TKey, TValue>
が、それは基本的に同じ問題であり、同じ解決策があります。
ありがとうございました!
編集
みんなありがとう、これが私が最終的に得たものです:
public static Type GetTypeParameter(object o, Type typeToSearch, int argumentNumber)
{
return o.GetType()
.GetInterfaces()
.Where(i => i.IsGenericType)
.Where(i => i.GetGenericTypeDefinition() == typeToSearch)
.Select(t => t.GetGenericArguments()[argumentNumber])
.FirstOrDefault();
}