我有一个方法可以获取对象属性的值并为其添加一些逗号。我想制作这个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();
,但它只返回属性本身,我不知道如何获取属性的值。
答案 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