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 obj为 be ref,然后您不需要返回您的对象。

于 2013-05-30T11:55:45.353 回答
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 回答
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 回答
0

您可以使用通用接口,即“IBulkStringEditable”行中的内容。该接口应包含一个方法“void SetStrings()”。然后,您的所有类都必须实现此接口和 SetStrings 方法,其中每个类都有不同的 SetStrings 内容,具体取决于它具有的字符串属性和您希望它们具有的值。然后以这种方式修改 SetStringPropertiesOnly 函数:

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

只是你可以dynamic在你的方法参数签名中使用这样--->

public static object SetStringPropertiesOnly(dynamic obj)
{
    // proceed
}
于 2013-05-30T11:59:15.847 回答