Как я могу получить значение поля через отражение, если имя отличается от имени поля - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть класс

 [BsonIgnoreExtraElements]
    public class CustomerModel
    {        
        public string BranchID { get; set; }       
        public string BranchName { get; set; }        
        public string ReceiverID { get; set; }
        public string ReceiverName{ get; set; }       

        }

Я пишу действие фильтра, которое может проверять любое поле с определенным значением, настроенным в MongoDB

"Exclude":[{"SourceCol":"Receiver Mode ID","Values":{"Value":["G","8","J"]}}

, и записывает логику сравнения как

 public static object GetPropValue(object src, string propName)
        {
            return src.GetType().GetProperty(propName).GetValue(src, null);
        }

        public static bool CheckPropertyCompare(CustomerModel customer, Exclude item)
        {
            var propertyValue = GetPropValue(customer, item.SourceCol);
            return item.Values.Value.ToList().Contains(propertyValue);

        }

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

TIA

1 Ответ

2 голосов
/ 26 сентября 2019

Я думаю, что вы можете достичь этого с помощью атрибутов, как вы говорите.

Вы можете создать собственный атрибут, например:

internal class MongoDBFieldAttribute : Attribute
{
    public string Field{ get; private set; }

    public MongoDBFieldAttribute(string field)
    {
        this.Field= field;
    }
}

Тогда в вашем классе:

public class CustomerModel
{        
    ...
    [MongoDBField("ReceiverModeID")]
    public string ReceiverID { get; set; }
}

Я думаю, что может быть лучше без пробелов, это может быть проблемой, может быть, вы можете использовать Trim () или аналогичный ... или йой может попробовать [MongoDBField ("Идентификатор режима приемника")], никогда не пытался.

Затем вы можете создать метод, который может связывать как имя свойства, так и имя атрибута, например:

   private Dictionary<string, string> getRelationPropertyAttribute(Type type)

    {
        var dicRelation = new Dictionary<string, string>();

        var properties = type.GetProperties();
        foreach (var property in properties)
        {
            var attributes = property.GetCustomAttributes(inherit: false);

            var customAttributes = attributes
                .AsEnumerable()
                .Where(a => a.GetType() == typeof(MongoDBFieldAttribute));

            if (customAttributes.Count() <= 0)
                continue;

            foreach (var attribute in customAttributes)
            {
                if (attribute is MongoDBFieldAttribute attr) 
                    dicRelation[attr.Field] = property.Name;
            }
        }

        return dicRelation;
    }

Наконец, вы можете поиграть с этим словарем, и в вашем методе вы можете сделатьчто-то вроде этого:

    public static bool CheckPropertyCompare(CustomerModel customer, Exclude item)
    {
        var dicRelation = getRelationPropertyAttribute(typeof(CustomerModel));

        var propertyName = dicRelation[item.SourceCol];
        var propertyValue = GetPropValue(customer, propertyName);
        return item.Values.Value.ToList().Contains(propertyValue);

    }

Это идея ... Надеюсь, это поможет.

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