我正在尝试学习如何传递某种类型的参数,该参数将告诉方法应编辑的属性。
我正在尝试将具有两个字符串列表的对象保存到json文件中。 因此,我有一个“添加”方法,可将字符串添加到列表之一,这是我需要一个参数的地方,该参数确定/指向/引用我要将方法添加到的列表。
我尝试使用Enums,但是随后我必须在方法中使用很多if语句,我认为有更好的方法来实现它。
我尝试了ref关键字,但是随后我必须创建对象(在调用“ Add”方法之前)并将其传递给该方法,但是我不想这样做,我希望该方法创建一个对象依靠自己,知道它必须编辑哪个列表。
注意:以下代码具有通用名称,为简单起见,不使用列表和整个json内容
注意:下一个代码是从控制台应用程序获取的
注意:“ ChangeStuff”方法的参数(refProp)不正确,因为我不知道该放在哪里。
所以我希望该方法能像这样工作:
class Stuff
{
public string One = "Normal";
public string Two = "Normal";
}
class Program
{
static void Main(string[] args)
{
ChangeStuff(StuffObject.One);
}
static void ChangeStuff(refProp)
{
Stuff StuffObject = new Stuff();
StuffObject.refProp = "Changed";
Console.WriteLine(StuffObject.refProp);
}
}
我希望ChangeStuff能够创建一个对象并更改“ refProp”所指向的属性,然后将该属性的值写入控制台。
答案 0 :(得分:2)
您可以利用表达式来引用类中的属性以进行更改。例如,
static void Main(string[] args)
{
var stuffObject = new Stuff();
var result = ChangeStuff(stuffObject,x=>x.Two);
}
static T ChangeStuff<T>(T target,Expression<Func<T,object>> exp)
{
var memberSelectorExpression = exp.Body as MemberExpression;
if (memberSelectorExpression != null)
{
var property = memberSelectorExpression.Member as PropertyInfo;
if (property != null)
{
property.SetValue(target, "Changed", null);
}
}
return target;
}
请注意,您需要将“类”中的“一”和“二”设为“属性”。
class Stuff
{
public string One {get;set;} ="Normal";
public string Two {get;set;} ="Normal";
}
您可以通过传递“新值”作为参数来进一步扩展它。
static TSource ChangeStuff<TSource,TValue>(TSource target,Expression<Func<TSource,TValue>> exp,TValue newValue)
{
var memberSelectorExpression = exp.Body as MemberExpression;
if (memberSelectorExpression != null)
{
var property = memberSelectorExpression.Member as PropertyInfo;
if (property != null)
{
property.SetValue(target, newValue, null);
}
}
return target;
}
现在您可以将方法调用为
ChangeStuff(stuffObject,x=>x.Two,"This is new value");
答案 1 :(得分:1)
解决该问题的方法可能有所不同,可以避免这样做。但是如果需要,您可以传递PropertyInfo:
ChangeStuff( stuff.GetType().GetProperty( nameof(stuff.One))
然后在方法中对属性使用Set Value
public void ChangeStuff( PropertyInfo property)
{
var stuff = new Stuff();
property.SetValue( stuff, "revised value", null);
}