循环遍历对象并获取属性

use*_*082 8 c# object

我有一个方法返回操作系统属性列表.我想循环遍历属性并对每个属性进行一些处理.所有属性都是字符串

我如何循环对象

C#

// test1 and test2 so you can see a simple example of the properties - although these are not part of the question
String test1 = OS_Result.OSResultStruct.OSBuild;
String test2 = OS_Result.OSResultStruct.OSMajor;

// here is what i would like to be able to do
foreach (string s in OS_Result.OSResultStruct)
{
    // get the string and do some work....
    string test = s;
    //......

}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 11

你可以用反射做到这一点:

// Obtain a list of properties of string type
var stringProps = OS_Result
    .OSResultStruct
    .GetType()
    .GetProperties()
    .Where(p => p.PropertyType == typeof(string));
foreach (var prop in stringProps) {
    // Use the PropertyInfo object to extract the corresponding value
    // from the OS_Result.OSResultStruct object
    string val = (string)prop.GetValue(OS_Result.OSResultStruct);
    ...
}
Run Code Online (Sandbox Code Playgroud)

[由Matthew Watson编辑] 我已经冒昧地根据上面的代码添加了另一个代码示例.

您可以通过编写将为IEnumerable<string>任何对象类型返回的方法来概括解决方案:

public static IEnumerable<KeyValuePair<string,string>> StringProperties(object obj)
{
    return from p in obj.GetType().GetProperties()
            where p.PropertyType == typeof(string)
            select new KeyValuePair<string,string>(p.Name, (string)p.GetValue(obj));
}
Run Code Online (Sandbox Code Playgroud)

您可以使用泛型进一步概括它:

public static IEnumerable<KeyValuePair<string,T>> PropertiesOfType<T>(object obj)
{
    return from p in obj.GetType().GetProperties()
            where p.PropertyType == typeof(T)
            select new KeyValuePair<string,T>(p.Name, (T)p.GetValue(obj));
}
Run Code Online (Sandbox Code Playgroud)

使用第二种形式,迭代您可以执行的对象的所有字符串属性:

foreach (var property in PropertiesOfType<string>(myObject)) {
    var name = property.Key;
    var val = property.Value;
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @MatthewWatson感谢您的编辑!我将输出更改为`IEnumerable <KeyValuePair <string,T >>`,以便为您的方法的用户提供属性名称的访问权限以及属性值. (2认同)