如何在c#中循环对象的属性?

时间:2013-04-25 12:21:56

标签: c#

我有一个方法可以获取对象属性的值并为其添加一些逗号。我想制作这个generinc所以我可以将它与其他对象一起使用。

            foreach (var row in rows.ToList())
            {
                sbResult.Append(
                    delimiter + row.MediaName + delimiter + separator +
                    delimiter + row.CountryName + delimiter + separator +
                    delimiter + row.ItemOverRideDate + delimiter + separator +
                    delimiter + row.Rating + delimiter + separator +
                    delimiter + row.BatchNo + delimiter + separator +
                    delimiter + row.NoInBatch + delimiter + separator +
                    delimiter + row.BatchDate + delimiter + separator +
                    delimiter + row.DataType + delimiter + separator +
                    delimiter + row.ByLine + delimiter + separator +
                    delimiter + row.IssueNo + delimiter + separator +
                    delimiter + row.Issue + delimiter + separator +
                    delimiter + row.MessageNo + delimiter + separator +
                    delimiter + row.Message + delimiter + separator +
                    delimiter + row.SourceName + delimiter + separator +
                    delimiter + row.SourceType + delimiter + separator);

                //end of each row
                sbResult.AppendLine();
            }

我尝试使用var rowData = row.GetType().GetProperties();,但它只返回属性本身,我不知道如何获取属性的值。

5 个答案:

答案 0 :(得分:2)

由于Type.GetProperties会返回PropertyInfo的集合,因此您可以通过调用PropertyInfo.GetValue来完成此操作。以下是使用LINQ:

的方法(以及其他所有内容)
var line = string.Join(
             row.GetType().GetProperties()
              .Select(pi => pi.GetValue(row))
              .Select(v => delimiter + v.ToString() + delimiter),
             separator);

但是,您可能想重新考虑一下您的方法。如果GetProperties获取静态属性或索引器以及“普通”属性,则此代码将中断;它还要求代码以完全信任的方式运行(否则无法进行反射)。最后,它会因为a)反射本来就很慢而且b)它会一遍又一遍地反复思考相同的事情,而不会缓存它已经发现的任何信息。

除了上述潜在问题之外,如果您以后甚至想要过滤打印出的内容的可能性很小,最好将此逻辑封装在{virtual?)方法中{ {1}}并执行类似

的操作
row

答案 1 :(得分:0)

var values = instance
    .GetType()
    .GetProperties(BindingFlags.Instance | BindingFlags.Public)
    .Select(z => string.Format("{0}: {1}\n", z.Name, z.GetValue(instance, null)));

string res = string.Concat(values);

instance是您对象的实例。如果需要StringBuilder,您可能希望避免LINQ并使用循环(取决于属性的数量)。

答案 2 :(得分:0)

您可以使用类似的东西来迭代特定类型的所有属性:

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

然后,您可以为所有字符串属性指定类型string

可编辑样本:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        private static void Main()
        {
            var test = new Test
            {
                Str1 = "S1",
                Str2 = "S2",
                Str3 = "S3",
                Str4 = "S4"
            };

            foreach (var property in PropertiesOfType<string>(test))
            {
                Console.WriteLine(property.Key + ": " + property.Value);
            }
        }

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

    public class Test
    {
        public string Str1 { get; set; }
        public string Str2 { get; set; }
        public string Str3 { get; set; }
        public string Str4 { get; set; }
    }
}

答案 3 :(得分:0)

在这里。

List<PropertyInfo> _propInfo = _row.GetType().GetProperties();

    foreach (var item in _propInfo)
    {
    object _value = item.GetValue(_row, null);
    if (_value != null)
    {
    // Save the Value
    }
    }

答案 4 :(得分:0)

GetProperties返回PropertyInfo数组,因此请使用GetValue方法并使用您输入的对象来获取每个属性的值。这是代码:

public class MyClass
{
    public string MyProperty1 { get; set; }
    public string MyProperty2 { get; set; }
    public string MyProperty3 { get; set; }
}

然后

MyClass myObj = new MyClass() { MyProperty1 = "first", MyProperty2 = "second", MyProperty3 = "third" };

List<string> array = new List<string>();

foreach (var item in typeof(MyClass).GetProperties())
{
    array.Add(item.GetValue(myObj, null).ToString());
}

var result = string.Join(",", array); //use your own delimiter