将属性列表作为强类型参数传递

本文关键字:强类型 参数传递 属性 列表 | 更新日期: 2023-09-27 18:21:17

我有一个从表达式中提取属性名称的方法:

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;
        }
    }

更新

首先,一次又一次地要求你指定对象的类型,这意味着你必须再次提供完整的表达式。

请尝试以下操作,它将要求您仅在一个表达式中指定所需的属性。

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#6nameof关键字。当然,这是假设您可以使用C#。

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;
}