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

C# 将属性列表作为强类型参数传递,c#,C#,我有一个从表达式中提取属性名称的方法: private static string GetPropertyName<TObj, TProp>(Expression<Func<TObj, TProp>> prop) { var expression = prop.Body as MemberExpression; if (expression != null) { var property = expression.Me

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

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

我希望能够一个接一个地传递属性集合。只是想清楚一点,属性可以是不同的类型。

可能是我,但我想你不需要这样做。你可以简单地使用C#6
nameof
关键字。这当然是假设您可以使用C#6

string name = nameof(u.Surname);
试试这个:

用法:
string[]props=GetPropertiesName((主窗口m)=>m.Lalala,(主窗口m)=>m.Lalala)

私有静态字符串[]GetPropertiesName(参数表达式[]prop)
{
List ret=新列表();
foreach(道具中的var项目)
ret.Add(GetPropertyName(项));
返回返回返回到阵列();
}
私有静态字符串GetPropertyName(表达式属性)
{
var expression=作为MemberExpression的prop.Body;
if(表达式!=null)
{
var property=expression.Member作为PropertyInfo;
if(属性!=null)
{
返回属性。名称;
}
}
返回字符串。空;
}

我完全同意@Patrick及其优于我的方式

但是如果你说你没有使用C#6.0,那么你可以使用你编写的代码。我只使用
参数
收益返回
和一个
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;
        }

    }

您是否能够利用
CallerMemberNameAttribute
来完全删除此代码?或者,在C#6中,新的
nameof
关键字。@AdamHouldsworth
CallerMemberName
如果您想在一个关键字中执行多个调用,则该关键字不可用
nameof
确实是。@Patrickhoffman是的,对这个案例没有用处,但我提到它也是为了强调它——它并不总是为人所知。真的。通常它确实非常有用。如果你不想使用C#6.0,你将使用你编写的代码,使用
param
并在方法中循环。它将返回属性的名称。StringList当我尝试此操作时,我得到:无法从用法推断方法“SqlQueryString.Core.StringExtensions.GetPropertiesName(string,params System.Linq.Expressions.Expression[])”的类型参数。请尝试显式指定类型参数。@osotorrio请检查udpate
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;
}
    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
});