Отметить свойства класса для отражения в C # - PullRequest
0 голосов
/ 20 сентября 2018

Привет, я получил этот простой класс DTO

public class Clientes_mdl
{        
    public int ID_Cliente { get; set; }
    public string RazonSocial { get; set; }        

    public Enumerador_mdl CondicionIva { get; set; }
    public Nullable<Enumerador_mdl> Transporte { get; set; }
    public IEnumerable<Direcciones_view> Direcciones { get; set; }
}       

ID_Cliente и RazonSocial свойства данных. Transporte и Direcciones являются свойствами навигации для других классов.

И я использую этот код отражения, чтобы получить имена свойств класса:

protected void base_UpdateCommand(IDbCommand myCommand, TEntity entity, string sWhere)
{
    var properties = (typeof(TEntity)).GetProperties().ToList();

    foreach (var prop in properties)
    {
        if (prop.Name.ToUpper() != sKeyField.ToUpper()
        {
            sProps = sProps + prop.Name + "=@" + prop.Name + ", ";                    
        }
    }
}

Теперь мне нужен способ игнорировать свойства навигации и получать только имена свойств данных класса (ID_Cliente и RazonSocial).Могу ли я использовать для этого декораторы?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Получил благодаря вашим предложениям:

public class Clientes_mdl
{        
    public int ID_Cliente { get; set; }
    public string RazonSocial { get; set; }        

    [KeyAttribute]
    public Enumerador_mdl CondicionIva { get; set; }
    [KeyAttribute]
    public Nullable<Enumerador_mdl> Transporte { get; set; }
    [KeyAttribute]
    public IEnumerable<Direcciones_view> Direcciones { get; set; }
}       

И код отражения:

protected void base_UpdateCommand(IDbCommand myCommand, TEntity entity, string sWhere)
{
    var properties = (typeof(TEntity)).GetProperties().ToList();

    foreach (var prop in properties)
    {
        bool bIgnore = prop.GetCustomAttributes(true).Any(a => a is KeyAttribute);
        if (prop.Name.ToUpper() != sKeyField.ToUpper() && !bIgnore)
        {
            sProps = sProps + prop.Name + "=@" + prop.Name + ", ";                    
        }
    }
}

Спасибо всем!

0 голосов
/ 20 сентября 2018

вы можете проверить, является ли это класс чем-то вроде:

        var properties = typeof(Clientes_mdl).GetProperties();

        var propertyNames = properties
            .Where(x => x.PropertyType == typeof(string) ||
                        !x.PropertyType.IsClass ||
                        !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)
            )
            .Select(x=>$"{x.Name} =@ {x.Name}")
            .ToArray();

        var propertyNameString = string.Join(",", propertyNames);

и если вы хотите оставить там списки, вы можете удалить !typeof(IEnumerable).IsAssignableFrom(x.PropertyType)

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