C# 为几种类型的类设置属性值的函数
我需要一个在C#4.0中具有以下签名的函数,我不知道从哪里开始: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
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