簡體   English   中英

在C#中標記類的屬性以進行反射

[英]Mark properties of class for reflection in C#

嗨,我有這個簡單的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_ClienteRazonSocial具有數據屬性。 TransporteDirecciones是其他類的導航屬性。

我使用此反射代碼來獲取類屬性名稱:

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)。 有什么裝飾我可以用來做嗎?

謝謝!

您可以檢查它是否是類似以下的類:

        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)

感謝您的建議:

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

感謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM