3

私はこのようなクラスを持っています:

public class ObjectA
{
    public ObjectB OneObject { get; set; }

    public List<ObjectC> ManyObject { get; set; }
}

そして、クラスに含まれるものを読み取り、プロパティのタイプを返す関数:

source = typeof(*some ObjectA*)

var classprops = source.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.PropertyType.IsClass && !x.PropertyType.IsValueType && x.PropertyType.Name != "String");

foreach (var prop in classprops)
{
    var classnamespace = CommonTool.GetNamespaceFromProp(prop);

    if ((prop.PropertyType).Namespace == "System.Collections.Generic")
    {
        string newprop = prop.ToString();
        int start = newprop.IndexOf("[")+1;
        int end = newprop.IndexOf("]");
        newprop = newprop.Substring(start, end-start);
        newprop = string.Format("{0}, Env.Project.Entites", newprop);
        classnamespace = newprop;
    }
    //some code to read attributes on the properties...
}

私の問題は、内にあるものですif ((prop.PropertyType).Namespace == "System.Collections.Generic")においがします。

それを行うためのより良い方法はありますか?

編集 :

アプリケーションのクラスはを使用しますList<int>
これによりクラッシュが発生しました。
においが悪いだけではありませんでした。

4

1 に答える 1

3

プロパティがジェネリック コレクションであるかどうかを確認し、要素の型を取得する場合は、要素が実装されているかどうかを確認し、実装されている場合IEnumerable<T>は型を取得できます。T

Type propType = prop.PropertyType;
if (propType.IsGenericType)
{
    Type enumerableType = propType.GetInterfaces().FirstOrDefault(it => it.IsGenericType && it.GetGenericTypeDefinition() == typeof(IEnumerable<>)));
    if(enumerableType != null)
    {
        Type elementType = enumerableType.GetGenericArguments()[0];
    }
}
于 2013-02-07T16:50:50.253 に答える