将对象属性的引用传递给方法

时间:2019-08-03 15:12:46

标签: c# json json.net

我正在尝试学习如何传递某种类型的参数,该参数将告诉方法应编辑的属性。

我正在尝试将具有两个字符串列表的对象保存到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”所指向的属性,然后将该属性的值写入控制台。

2 个答案:

答案 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);
}