Как вы можете перебирать свойства класса?
Есть ли способ в С# перебирать свойства класса?
В принципе у меня есть класс, который содержит большое количество свойств (в основном он содержит результаты большого запроса к базе данных).
Мне нужно вывести эти результаты как CSV файл, поэтому нужно добавить каждое значение в строку.
Очевидный способ вручную добавить каждое значение в строку, но есть ли способ эффективно обходить объект результатов и в свою очередь добавлять значение для каждого свойства?
Ответы
Ответ 1
Конечно; вы можете сделать это разными способами; начиная с отражения (обратите внимание, что это медленнее - ОК для умеренных объемов данных):
var props = objectType.GetProperties();
foreach(object obj in data) {
foreach(var prop in props) {
object value = prop.GetValue(obj, null); // against prop.Name
}
}
Тем не менее; для больших объемов данных было бы целесообразно сделать это более эффективным; например, здесь я использую API Expression
для предварительной компиляции делегата, который выглядит как запись каждого свойства. Преимущество здесь заключается в том, что для каждой строки не требуется никакого отражения (это должно быть значительно быстрее для больших объемов данных):
static void Main()
{
var data = new[] {
new { Foo = 123, Bar = "abc" },
new { Foo = 456, Bar = "def" },
new { Foo = 789, Bar = "ghi" },
};
string s = Write(data);
}
static Expression StringBuilderAppend(Expression instance, Expression arg)
{
var method = typeof(StringBuilder).GetMethod("Append", new Type[] { arg.Type });
return Expression.Call(instance, method, arg);
}
static string Write<T>(IEnumerable<T> data)
{
var props = typeof(T).GetProperties();
var sb = Expression.Parameter(typeof(StringBuilder));
var obj = Expression.Parameter(typeof(T));
Expression body = sb;
foreach(var prop in props) {
body = StringBuilderAppend(body, Expression.Property(obj, prop));
body = StringBuilderAppend(body, Expression.Constant("="));
body = StringBuilderAppend(body, Expression.Constant(prop.Name));
body = StringBuilderAppend(body, Expression.Constant("; "));
}
body = Expression.Call(body, "AppendLine", Type.EmptyTypes);
var lambda = Expression.Lambda<Func<StringBuilder, T, StringBuilder>>(body, sb, obj);
var func = lambda.Compile();
var result = new StringBuilder();
foreach (T row in data)
{
func(result, row);
}
return result.ToString();
}
Ответ 2
foreach (PropertyInfo prop in typeof(MyType).GetProperties())
{
Console.WriteLine(prop.Name);
}
Ответ 3
Я пробовал различные рекомендации на этой странице, я не мог заставить их работать. Я начал с верхнего ответа (вы заметите, что мои переменные аналогично названы), и просто проработал это самостоятельно. Это то, что я получил, чтобы работать - надеюсь, это может помочь кому-то другому.
var prop = emp.GetType().GetProperties(); //emp is my class
foreach (var props in prop)
{
var variable = props.GetMethod;
empHolder.Add(variable.Invoke(emp, null).ToString()); //empHolder = ArrayList
}
*** Я должен упомянуть, что это будет работать только в том случае, если вы используете get; set; (общедоступных).
Ответ 4
Вы можете создать список свойств проекта
IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
И затем используйте foreach, чтобы перейти в список.
foreach (var property in properties)
{
here code...
}
Ответ 5
Используйте что-то вроде
StringBuilder csv = String.Empty;
PropertyInfo[] ps this.GetType().GetProperties();
foreach (PropertyInfo p in ps)
{
csv.Append(p.GetValue(this, null);
csv.Append(",");
}
Ответ 6
var csv = string.Join(",",myObj
.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Select(p => p.GetValue(myObj, null).ToString())
.ToArray());
Ответ 7
вот как перебирать свойства в vb.net, свою же концепцию в С#, просто перевести синтаксис:
Dim properties() As PropertyInfo = Me.GetType.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
If properties IsNot Nothing AndAlso properties.Length > 0 Then
properties = properties.Except(baseProperties)
For Each p As PropertyInfo In properties
If p.Name <> "" Then
p.SetValue(Me, Date.Now, Nothing) 'user p.GetValue in your case
End If
Next
End If
Ответ 8
Пересечение свойств
Type t = typeof(MyClass);
foreach (var property in t.GetProperties())
{
}
Ответ 9
string target = "RECEIPT_FOOTER_MESSAGE_LINE" + index + "Column";
PropertyInfo prop = xEdipV2Dataset.ReceiptDataInfo.GetType().GetProperty(target);
Type t = xEdipV2Dataset.ReceiptDataInfo.RECEIPT_FOOTER_MESSAGE_LINE10Column.GetType();
prop.SetValue(t, fline, null);
Присутствует для этого: целевой объект должен быть установлен
Ответ 10
string notes = "";
Type typModelCls = trans.GetType(); //trans is the object name
foreach (PropertyInfo prop in typModelCls.GetProperties())
{
notes = notes + prop.Name + " : " + prop.GetValue(trans, null) + ",";
}
notes = notes.Substring(0, notes.Length - 1);
Затем мы можем записать строку примечаний в виде столбца в таблицу журнала или в файл. Вы должны использовать System.Reflection для использования PropertyInfo