2

重複の可能性:
C# でリフレクションを使用して文字列からプロパティ値を取得する

データベースのフィールドをメールや手紙にマージするアプリケーションがあります。さまざまなユーザーがいるため、さまざまなフィールドをマージするように要求されます。また、新しいマージフィールドを作成すると、ドキュメントも作り直す必要があります。これにより問題が発生するため、ドキュメントを自動化したいと考えています。

次のコードを思いつきました (この例では、stringField と呼ばれるマージフィールドを 2 つだけ定義しましたが、現在はほぼ 100 です)。

namespace ReflectionTest
{

    public class clReflection
    {
        private System.Data.DataTable dtClient = new System.Data.DataTable();

        public int ClientNumber { get; set; }
        public int AdressNumber { get; set; }



        public stringField ClientName
        {
            get
            {
                stringField _ClientName = new stringField();
                _ClientName.FieldContent = "Obama";
                _ClientName.FieldNote = "Last name of client";
                //Available email and available letter should be default true
                return _ClientName; 
            }
            set { }
        }

        public stringField ClientEmail
        {
            get
            {
                stringField _ClientEmail = new stringField();
                _ClientEmail.FieldContent = "obama@whitehouse.gov";
                _ClientEmail.FieldNote = "use only tested email adresses";
                _ClientEmail.AvailableLetter = false;
                return _ClientEmail; 
            }
            set
            { }
        }



    }

    public static class FindStringFields
    {
        public static System.Data.DataTable stringFields()
        {
            System.Data.DataTable dtStringFields = new System.Data.DataTable();
            dtStringFields.Columns.Add(new System.Data.DataColumn("FieldName", typeof(string)));
            dtStringFields.Columns.Add(new System.Data.DataColumn("FieldNote", typeof(string)));
            dtStringFields.Columns.Add(new System.Data.DataColumn("AvailableEmail", typeof(bool))); 

            clReflection test = new clReflection();
            System.Reflection.PropertyInfo[] props = test.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
            for (int i = 0; i < props.Length; i++)
            {
                if (props[i].PropertyType == typeof(stringField))
                {
                    dtStringFields.Rows.Add(new object[] { props[i].Name , "FieldNote", true });

                }
            }
            return dtStringFields;
        }
    }


    public class stringField
    {
        private bool _AvailableEmail = true;
        private bool _AvailableLetter = true;


        public string FieldContent { get; set; }
        public string FieldNote { get; set; }
        public bool AvailableEmail
        {
            get { return _AvailableEmail; }
            set { AvailableEmail = value; }

        }

        public bool AvailableLetter
        {
            get { return _AvailableLetter; }
            set { _AvailableLetter  = value; }
        }

    }
}

命令を起動すると: System.Data.DataTable dtTest = FindStringFields.stringFields(); 定義されたすべての stringFields を含むデータテーブルを取得します。ただし、stringfield の名前は別として、stringfield のプロパティを取得できません。他のプロパティを取得できるように、見つかった stringField をインスタンス化するにはどうすればよいですか?

ありがとう、

ロブ

4

3 に答える 3

0

Type.GetPropertiesメソッドを使用して、型のすべてのパブリック プロパティを取得します。

Type type = typeof(stringField);
PropertyInfo[] properties = type.GetProperties();

また、BindingFlags を指定できるオーバーロードもあります。

次に、プロパティの値を取得できます。

object value = property.GetValue(_ClientEmail);
于 2012-11-20T08:33:23.207 に答える
0

文字列フィールド名がある場合は、これを試してください:

public static object GetPropValue( object src, string propName )
 {
     return src.GetType( ).GetProperty( propName ).GetValue( src, null );
 }

このSO投稿から抽出:

C# でリフレクションを使用して文字列からプロパティ値を取得する

于 2012-11-20T08:34:44.000 に答える
0

次のようなことができます。

   //its better to use a property than get it from the array every time!
   PropertyInfo pi = prop[i]; 

    //get the underlying value
    stringField underlyingStringField = prop.GetValue(test, null) as stringField; 

    //use the underlying value now
    Debug.Write(underlyingStringField.AvalilableEmail);

    ...
于 2012-11-20T08:40:21.240 に答える