在C#中标记类的属性以进行反射

时间:2018-09-20 17:48:34

标签: c# reflection

嗨,我有这个简单的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 数据属性。 运输 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 :(得分:1)

您可以检查它是否是类似以下的类:

        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)

答案 1 :(得分:0)

感谢您的建议:

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 + ", ";                    
        }
    }
}

谢谢大家!