C# 为几种类型的类设置属性值的函数

C# 为几种类型的类设置属性值的函数,c#,.net,C#,.net,我需要一个在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 (); my

我需要一个在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);
所以这里的对象类型是动态的

这种方法可行吗

谢谢

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;
}
考虑将方法签名更改为接受
参数,并将
对象obj
更改为
ref
,这样就不需要返回对象了


考虑将方法签名更改为接受
参数,并将
对象obj
更改为
ref
,这样您就不需要返回对象。

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

public static IBulkStringEditable SetStringPropertiesOnly(IBulkStringEditable obj)
{
    obj.SetStrings();
    return obj;
}

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

public static IBulkStringEditable SetStringPropertiesOnly(IBulkStringEditable obj)
{
    obj.SetStrings();
    return obj;
}

我想您应该返回对象本身。 但是,您应该了解,原始对象也将被更改

    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");

顺便说一句,您需要这样做的事实可能被认为是一个“难闻的代码”。如果可以,请重新考虑此设计。

我想您希望返回对象本身。 但是,您应该了解,原始对象也将被更改

    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");

顺便说一句,您需要这样做的事实可能被认为是一个“难闻的代码”。如果可以,请重新考虑此设计。

只需在您的方法参数签名中使用
动态
,就像这样-->


只需在您的方法参数签名中使用
dynamic
,如下所示-->


使用反射并不困难。我们还可以将其作为对象扩展(使用时看起来很可爱):


使用反射并不困难。我们还可以将其作为对象扩展(使用时看起来很可爱):



您还想设置什么字符串属性?这似乎是一个非常有问题的设计-重新审视该方法和/或在stackoveflow上发布一个单独的问题会有所帮助。您的问题表明您希望SetStringProperty单独迭代对象的属性,并且如果这些属性的任何类型是字符串,则返回原始对象。我不认为这是你想要的,因为这个方法的名称,所以你可能应该试着澄清一下你想做的事情。我同意@aquaraga。这似乎是一个可疑的方法。嗯,人们,这显然是因为一个糟糕的设计。但是我需要这个解决方法来清除一些输入数据以进行验证。谢谢大家的回答,你太棒了。你还想设置字符串属性吗?这似乎是一个非常有问题的设计-它将有助于重新审视该方法和/或在stackoveflow上发布一个单独的问题。你的问题表明,你想让SetStringProperty正确地迭代对象的属性,如果这些属性中的任何一个的类型是字符串返回原始对象。我不认为这是你想要的,因为这个方法的名称,所以你可能应该试着澄清一下你想做的事情。我同意@aquaraga。这似乎是一个可疑的方法。嗯,人们,这显然是因为一个糟糕的设计。但是我需要这个解决方法来清除一些输入数据以进行验证。对于答案,谢谢大家,你们真是太棒了。这意味着每当你们想要在一个类上实现这个功能时,你们都必须编写一个新的实现,反射通常会帮你们完成。反射是性能、可扩展性和可维护性的噩梦。如果您突然意识到这个类中有一个属性需要以不同的方式设置,该怎么办?然后你必须重写一切。接口正是为了实现这一点,除非绝对必要,否则应避免反射。重写一个通用代码块要比在大量不同的实现中写入一些东西快得多。当然,灵活性是一件复杂的事情,需要付出努力才能实现。如果一个人不需要它,他就不必实现它,这只是OOP中遵循这些标准的一般准则,仅此而已:)这意味着每次你想在类上实现这个功能时,你都必须编写一个新的实现,反射通常会为你这样做。反射是一种性能,可扩展性和可维护性。如果您突然意识到这个类中有一个属性需要以不同的方式设置,该怎么办?然后你必须重写一切。接口正是为了实现这一点,除非绝对必要,否则应避免反射。重写一个通用代码块要比在大量不同的实现中写入一些东西快得多。当然,灵活性是一件复杂的事情,需要付出努力才能实现。如果一个人不需要它,他就不需要实现它,这就是j