0

多くのプロパティを持つ巨大なユーザー定義クラスがあり、それらのいくつかは特定の値で設定する必要があります。

より具体的には、このユーザー定義クラスの文字列型のすべてのパブリック プロパティは、実行の最後に「空にする」必要があります。

そのため、すべてのパブリック プロパティ (300 プロパティなど) に 1 つずつアクセスし、300 行のコードを割り当てました。この問題を解決するために私がしたことは、私が必要としていたことでしたが、もちろん私を満足させませんでした。

そこで、オブジェクト インスタンスのプロパティを反復処理し、動的にアクセス/操作するヘルパー メソッドを C# で(拡張メソッドとして) 記述することにしました。ここでプロパティの反復処理に関する同様の質問をいくつか見ましたが、これまでのところプロパティ値の変更については何も見ていません。これが私が試したものです:

public static void SetDefaultStringValues(this Object myObject)
{
    PropertyInfo[] aryProperties = entityObject.GetType().GetProperties();

    foreach (object property in aryProperties)
    {
        if (property is String) 
        {
            //property = String.Empty;
        }
    }
}

コメントされた部分は、変数を設定した行でなければなりませんでしたが、それは実際には成功例ではありませんでした:)助けていただければ幸いです。

4

4 に答える 4

2

PropertyInfo.SetValue メソッドを使用します。詳細については、こちらを参照してください。

于 2013-02-07T11:35:03.163 に答える
1

怠惰なコーディングPropertyDescriptorに使用できます。(静的ではなく)パブリックインスタンスSystem.ComponentModelメソッドを反復処理する場合は、次のサンプルを試すことができます。

テスト クラス

public class TestClass
{
    private int mIntMemeber = 0;                    // # to test int type   
    private string mStringMember = "abc";           // # to test string type (initialized)
    private string mNullStringMember = null;        // # to test string type (null)

    private static string mStaticNullStringMember;  // # to test string type (static)

    // # Defining properties for each member
    public int IntMember                            
    {
        get { return mIntMemeber; }
        set { mIntMemeber = value; }                
    }

    public string StringMember                      
    {
        get { return mStringMember; }
        set { mStringMember = value; }
    }

    public string NullStringMember
    {
        get { return mNullStringMember; }
        set { mNullStringMember = value; }
    }

    public static string StaticNullStringMember
    {
        get { return mStaticNullStringMember; }
        set { mStaticNullStringMember = value; }
    }
}

SetDefaultStringValues() 拡張メソッド

public static string SetDefaultStringValues(this TestClass testClass)   
{
    StringBuilder returnLogBuilder = new StringBuilder();
    // # Get all properties of testClass instance
    PropertyDescriptorCollection propDescCollection = TypeDescriptor.GetProperties(testClass);
    // # Iterate over the property collection
    foreach (PropertyDescriptor property in propDescCollection)
    {
        string name = property.Name;
        Type t = property.PropertyType; // # Get property type
        object value = property.GetValue(testClass); // # Get value of the property (value that member variable holds)

        if (t == typeof(string)) // # If type of propery is string and value is null
        {
            property.SetValue(testClass, String.Empty); // # Set value of the property (set member variable)
            value = String.Empty; // # <-- To prevent NullReferenceException when printing out
        }

        returnLogBuilder.AppendLine("*****\nName:\t{0}\nType:\t{1}\nValue:\t{2}", name, t.ToString(), value.ToString());
    }

    returnLogBuilder.AppendLine("*****");
    return returnLogBuilder.toString();
}

ループ内でnullかどうかを確認することもできます。SetDefaultStringValuesメソッドパラメータは、任意のオブジェクトインスタンスにすることができます。に変更して、定義したクラスインスタンスの拡張メソッドSetDefaultStringValues(this object o)として使用できます。

于 2013-02-07T12:35:22.557 に答える
0

プロパティタイプを確認するには、別の構文が必要です。さらに、プロパティにパブリックセッターがあることを確認します。

if (property.PropertyType == typeof(string) && property.GetSetMethod() != null)
    property.SetValue(entityObject, "");
于 2013-02-07T11:39:41.023 に答える
0
    foreach (PropertyInfo property in aryProperties)
    {
        if (property.PropertyType == typeof(string) && property.CanWrite) 
        {
            property.SetValue(myObject, "", null);
        }
    }
于 2013-02-07T11:48:13.137 に答える