0

C# 4.0 で次のシグネチャを持つ関数が必要です。どこから始めればよいかわかりません。

public static object SetStringPropertiesOnly(object obj)
{

   //iterate all properties of obj
   //if the type of the property is string,
   //return obj
}

そして最終的に、異なるクラスから派生したいくつかのオブジェクトにこの関数を使用したいと考えています。

myClass1 obj1 = new myClass1 ();
myClass2 obj2 = new myClass2 ();
.....
.....
obj1 = SetStringPropertiesOnly(obj1);
obj2 = SetStringPropertiesOnly(obj2);

したがって、ここではオブジェクトのタイプは動的です。

そのような方法は可能ですか?

ありがとう。

4

5 に答える 5

3
public static object SetStringPropertiesOnly(object obj)
{
  //Get a list of properties where the declaring type is string
  var stringProps = obj.GetType().GetProperties().Where(x => x.PropertyType == typeof(string)).ToArray();
  foreach (var stringProp in stringProps)
  {
    // If this property exposes a setter...
    if (stringProp.SetMethod != null)
    {
      //Do what you need to do
      stringProp.SetValue(obj, "value", null);
    }
  }
  //What do you want to return?
  return obj;
}

valueパラメータを受け入れるようにメソッドのシグネチャを変更し、 に変更することを検討してくださいobject objrefその場合、オブジェクトを返す必要はありません。

于 2013-05-30T11:55:45.353 に答える
1

リフレクションを使用するのは難しくありません。また、オブジェクト拡張としても実行できます (使用するとかわいく見えます):

public static class ObjectExtensions
{
    public static T SetStringPropertiesOnly<T>(this T obj) where T : class
    {
        var fields = obj.GetType().GetProperties();

        foreach (var field in fields)
        {
            if (field.PropertyType == typeof (string))
            {
                field.SetValue(obj, "blablalba", null); //set value or do w/e your want
            }
        }
        return obj;

    }
}

と使用法:

var obj = someObject.SetStringPropertiesOnly();
于 2013-05-30T12:01:19.593 に答える
1

オブジェクト自体を返したいと思います。ただし、元のオブジェクトも変更されることを理解する必要があります。

    public static object SetStringPropertiesOnly(object obj)
    {
        var properties = obj.GetType().GetProperties();
        var strings = properties.Where(p=>p.PropertyType == typeof(string);
        foreach(PropertyInfo property in strings)
        {
            property.SetValue(obj, "Value");
        }
        return obj;
    }

私のアプローチは、オブジェクトが変更されるため、拡張メソッドを作成して void を返すことです。また、必要な文字列をパラメーターとして追加します。

    public static void SetStringProperties(this object obj, string value)
    {
        var properties = obj.GetType().GetProperties();
        var strings = properties.Where(p=>p.PropertyType == typeof(string);
        foreach(PropertyInfo property in strings)
        {
            property.SetValue(obj, value);
        }
        return obj;
    }

次のように拡張メソッドを呼び出すことができます。

obj.SetStringProperties("All strings will have this value");

ちなみに、これを行う必要があるという事実は、「悪臭を放つコード」と見なされる場合があります。可能であれば、この設計を再検討してください。

于 2013-05-30T11:57:29.893 に答える
0

「IBulkStringEditable」の行にある共通のインターフェイスを使用できます。インターフェイスには、メソッド「void SetStrings()」が含まれている必要があります。次に、すべてのクラスでこのインターフェイスと SetStrings メソッドを実装する必要があります。各クラスには、文字列プロパティと必要な値に応じて、SetStrings のさまざまな内容があります。次に、SetStringPropertiesOnly 関数を次のように変更します。

public static IBulkStringEditable SetStringPropertiesOnly(IBulkStringEditable obj)
{
    obj.SetStrings();
    return obj;
}
于 2013-05-30T11:55:47.293 に答える