c # Получить, если тип свойства наследуется от одного абстрактного универсального класса с отражением - PullRequest
1 голос
/ 01 октября 2019

Я хотел бы получить все свойства, содержащиеся в классе, чьи типы наследуются от определенного абстрактного и универсального класса.

public abstract class foo<T> { }

public class fooInt_Indexed : foo<int> { }
public class fooInt_Not_Indexed : foo<int> { }
public class fooString_Compressed : foo<string> { }
public class fooString_Indexed : foo<string> { }
public class fooFloat : foo<float> { }

public abstract class bar
{

}

public class foobar : bar
{
    public fooInt_Indexed value { get; set; }
    public fooInt_Not_Indexed someOtherValue { get; set; }
    public fooFloat someFloat { get; set; }
    public otherData<int> {get; set; }
}

public class barChecker<T> where T : bar
{
    public List<PropertyInfo> fooprops = new List<PropertyInfo>();
    public static barChecker<T> Generator()
    {
        var @new = new barChecker<T>();
        foreach (var item in typeof(T).GetProperties())
        {
            if (item.PropertyType is somesortof(foo<>)) @new.fooprops.Add(item);
        }
        return @new;
    }

Что мне нужно поместить в код класса barChecker<T>, чтобы его список fooprops содержал информацию о свойствах "value", "someOtherValue" и "someFloat" при генерации как barChecker<foobar>

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вот метод расширения до System.Type, который ответит на этот и подобные вопросы о наследовании:

public static class TypeExtensions
{
    public static bool InheritsFrom(this Type t, Type baseType)
    {
        if (t.BaseType == null)
        {
            return false;
        }
        else if (t == baseType)
        {
            return true;
        }
        else if (t.BaseType.IsGenericType && t.BaseType.GetGenericTypeDefinition().InheritsFrom(baseType))
        {
            return true;
        }
        else if (t.BaseType.InheritsFrom(baseType))
        {
            return true;
        }
        return false;
    }

    public static bool InheritsFrom<TBaseType>(this Type t)
        => t.InheritsFrom(typeof(TBaseType));
}

Вы бы использовали его так:

public static barChecker<T> Generator()
{
    var rtn = new barChecker<T>();
    foreach (var item in typeof(T).GetProperties())
    {
        if (item.PropertyType.InheritsFrom(typeof(foo<>)))
        {
            rtn.fooprops.Add(item);
        }
    }
    return rtn;
}

Или сделайте этоуниверсальный и параметризованный foo<>:

public static barChecker<T> Generator2<TInheritsFrom>()
    => new barChecker<T> {
        fooprops = typeof(T).GetProperties()
            .Where(pi => pi.PropertyType.InheritsFrom<TInheritsFrom>())
            .ToList()
    };

И используйте это так:

var barchkr = barChecker<SomeClass>.Generate<foo<>>();
0 голосов
/ 01 октября 2019

Это здесь:

    item.PropertyType is somesortof(foo<>)

Должен быть заменен на

    typeof(YourType).IsAssignableFrom(item.PropertyType)

Оператор 'is' предназначен только для экземпляров реальных объектов, но не если у вас уже есть Type-Reference.

Итак, в вашем случае «YourType» является typeof (barchecker )?

...