Проблема с выражением динамической сортировки - PullRequest
0 голосов
/ 27 апреля 2018

Допустим, у меня есть иерархия классов, как

public class A
{
    public int AMember { get; set; }
}

public class B
{
    public int BMember { get; set; }
    public virtual A AasMember { get; set; }
}

public static class OrderByUtility
{
    public static bool PropertyExists<T>(string propertyName)
    {
        return typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase |
                     BindingFlags.Public) != null;
    }
}

Из основного класса, когда я использую эту утилиту

OrderByUtility.PropertyExists BClass>("BMember");

Это работает нормально и возвращает TRUE. Но всякий раз, когда я использую

OrderByUtility.PropertyExists BClass> ("AMember"); returns False

Я хочу, чтобы одна и та же функция PropertyExist работала для всех составных объектов. Пожалуйста, предложите решить эту проблему. Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Вот очень наивная реализация. Вы можете сделать рекурсивным продолжать проверять вложенные типы. Он также хранит кэш, поэтому он не выполняет дорогостоящую обработку при каждом поиске.

public class A
{
    public int AMember { get; set; }
}

public class B
{
    public int BMember { get; set; }
    public virtual A AasMember { get; set; }
}

public static class OrderByUtility
{
    private static readonly Dictionary<Type, Dictionary<string, bool>> Seen =
        new Dictionary<Type, Dictionary<string, bool>>();

    public static bool PropertyExists<T>(string propertyName)
    {
        var type = typeof(T);

        if (!Seen.TryGetValue(type, out var props))
        {
            props = new Dictionary<string, bool>();
            Seen[type] = props;
        }

        if (props.ContainsKey(propertyName))
        {
            return props[propertyName];
        }

        var prop = GetPropertyByName(type, propertyName);
        if (prop == null)
        {
            foreach (var p in type.GetProperties())
            {
                var propType = p.PropertyType;
                if (!propType.IsClass && !propType.IsInterface) continue;

                prop = GetPropertyByName(propType, propertyName);
                if (prop != null)
                {
                    break;
                }
            }
        }

        props[propertyName] = prop != null;
        return props[propertyName];
    }

    private static PropertyInfo GetPropertyByName(Type t, string name)
    {
        return t.GetProperty(name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
    }
}

Использование:

bool exists = OrderByUtility.PropertyExists<B>("AMember");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...