如何使用Linq查询和IEnumerable获取类属性的值

3
我有以下类。
public class User
{
    public User() { }
    public int Id; 
    public string Name; 
    public string Surname; 
    public string PhoneMobil; 
    public string SecondaryPhone; 
    public string Job; 
    public string Sex; 
    public string DepartmentName; 

    public int ID { get{return Id;} set { Id = 111; } }
    public string NAME { get { return Name; } set { Name = "ahsan riaz 1111"; } }
    public string SURNAME { get { return Surname; } set { Surname = "ahsan 1111 riaz"; } }
    public string PHONEMOBIL { get { return PhoneMobil; } set { PhoneMobil = "riaz ahsan"; } }
    public string SECONDARYPHONE { get { return SecondaryPhone; } set { SecondaryPhone = "How are you?"; } }
    public string JOB { get { return Job; } set { Job = "How do you do?"; } }
    public string SEX { get { return Sex; } set { Sex = "What and How do you do?"; } }
    public string DEPARTMENTNAME { get { return DepartmentName; } set { DepartmentName = "ahsan riaz"; } }
}

我想要在Linq查询中获取每个属性的值。

public static IEnumerable<string> Suggestions<T>(this T user) where T : class
{
    var query = from p in user.GetType().GetProperties()
                select p.GetValue(/* it takes the name of property, i cannot provided name for each property*/);
    return query.AsEnumerable();
}

问题是如何通过 linq 中的 p.GetValue 获得每个属性的值。


7
你似乎对属性如何工作有一种奇怪的看法。你的 setter 方法没有意义,许多人认为它们完全“错误”。 - nvoigt
如果你的Id字段是int类型,为什么要返回IEnumerable<string>呢? - VMAtm
2
你确定这段代码是正确的吗?第一次访问任何属性都会导致堆栈溢出。 - vgru
@Ahsan:在这种情况下,这可能会有用:C# 命名约定 - vgru
@Groo:感谢分享。 - Ahsan
1个回答

8
 var query = from p in user.GetType().GetProperties()
                    select p.GetValue(user).ToString();

需要调用 ToString() 方法,因为你想要一个字符串的可枚举对象,而不是一个对象的可枚举对象。然而,这样做有可能会在属性值等于 null 的情况下出现空引用错误。

一个更加安全的替代方法是:

var query = user.GetType()
                .GetProperties()
                .Select(p => p.GetValue(user))
                .Select(o => Object.ReferenceEquals(o, null) 
                          ? default(string) 
                          : o.ToString()
                       );

编译时错误:遇到了“p”未声明的标识符。 - Ahsan
答案的第一部分非常完美。谢谢。 - Ahsan
@Ahsan - 我已经修复了“p未声明标识符”错误 - 这是一个简单的语法错误。 - Andrew Shepherd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接