簡體   English   中英

將屬性列表作為強類型參數傳遞

[英]Passing property list as strongly typed parameters

我有這種方法可以從表達式中提取屬性名稱:

private static string GetPropertyName<TObj, TProp>(Expression<Func<TObj, TProp>> prop)
{
    var expression = prop.Body as MemberExpression;

    if (expression != null)
    {
        var property = expression.Member as PropertyInfo;

        if (property != null)
        {
            return property.Name;
        }
    }

    return string.Empty;
}

所以以后我可以這樣使用它:

GetPropertyName((User u) => u.Surname); //Returns "Surname"

我希望能夠逐個傳遞一組屬性。 需要明確的是,這些屬性可以具有不同的類型。

我完全同意@Patrick及其相對於我的首選方式。

但是如果您說您沒有使用C#6.0,那么您可以使用編寫的代碼。 我只是使用paramyield return和一個foreach循環

    private static IEnumerable<string> GetPropertyName<TObj, TProp>(params Expression<Func<TObj, TProp>>[] propCollection)
    {

        foreach (var prop in propCollection)
        {

            var expression = prop.Body as MemberExpression;

            if (expression != null)
            {
                var property = expression.Member as PropertyInfo;

                if (property != null)
                {
                    yield return property.Name;
                }
            }
            yield return string.Empty;
        }

    }

UPDATE

第一個要求您再次指定對象的類型,一次又一次意味着您必須再次提供全長表達式。

嘗試以下操作,它將要求您僅在一個表達式中指定所需的屬性。

public static IEnumerable<string> GetPropertiesName<TObj, TProp>(Expression<Func<TObj, TProp[]>> prop)
{
    var array = (prop.Body as NewArrayExpression);
    var exp = array == null ? null : array.Expressions;

    if (exp != null)
    {
        //var expArr = (prop.Body as NewArrayExpression).Expressions;

        foreach (var oneProp in exp)
        {
            Expression onePropExp;
            if (oneProp.GetType() == typeof (UnaryExpression))
            {
                onePropExp = (oneProp as UnaryExpression).Operand;
            }
            else
            {
                onePropExp = oneProp;
            }
            var property = (onePropExp as MemberExpression).Member as PropertyInfo;

            if (property != null)
            {
                yield return property.Name;
            }
            yield return string.Empty;
        }

    }
    yield return string.Empty;
}

您可以這樣稱呼它-

var propNames = GetPropertiesName((AllSubsTransAndDevices d) => new[]
{
    d.CurrentDriverId,
    d.GPSDevicesId,
    d.TransporterId
});

可能是我,但我認為您無需艱難地做到這一點。 您可以簡單地使用C#6 nameof關鍵字。 假設您當然可以使用C#6。

string name = nameof(u.Surname);

嘗試這個:

用法: string[] props = GetPropertiesName((MainWindow m) => m.Lalala, (MainWindow m) => m.Lalala);

private static string[] GetPropertiesName<TObj, TProp>(params Expression<Func<TObj, TProp>>[] prop)
{
    List<string> ret = new List<string>();
    foreach (var item in prop)
        ret.Add(GetPropertyName(item));
    return ret.ToArray();
}
private static string GetPropertyName<TObj, TProp>(Expression<Func<TObj, TProp>> prop)
{
    var expression = prop.Body as MemberExpression;

    if (expression != null)
    {
        var property = expression.Member as PropertyInfo;

        if (property != null)
        {
            return property.Name;
        }
    }

    return string.Empty;
}

暫無
暫無

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

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