1

オブジェクトのプロパティの値を取得し、それにコンマを追加するメソッドがあります。他のオブジェクトで使用できるように、このジェネリックを作成したいと考えています。

            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();ましたが、プロパティ自体のみが返され、プロパティの値を取得する方法がわかりません。

4

5 に答える 5

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) 既に発見した情報をキャッシュすることなく、同じことを何度も何度もリフレクションし続けるため、遅くなります。

上記の潜在的な問題に加えて、後で出力されるものをフィルタリングする可能性が少しでもある場合は、このロジックを ( ?) メソッド内にカプセル化し、次のようにすることをお勧めしますvirtualrow

sbResult.AppendLine(row.SerializeAsLine());
于 2013-04-25T12:25:24.033 に答える
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オブジェクトのインスタンスはどこにありますか。必要に応じて、LINQ を使用せずにループを使用することをお勧めしますStringBuilder(プロパティの数によって異なります)。

于 2013-04-25T12:24:34.560 に答える
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; }
    }
}
于 2013-04-25T12:26:09.550 に答える
0

ここにあります。

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

    foreach (var item in _propInfo)
    {
    object _value = item.GetValue(_row, null);
    if (_value != null)
    {
    // Save the Value
    }
    }
于 2013-04-25T12:26:14.753 に答える
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 
于 2013-04-25T12:29:08.483 に答える