有没有办法通过c#中的变量名称访问变量的引用

时间:2019-04-13 07:13:28

标签: c#

我正在将参数和值列表从Class_B传递给Class_A。 Class_A必须设置名称包含在参数中的参数的值。

struct Parameter
{
    public Parameter(string n , object v, Type t){Name = n; Value=v; TypeOfParam = t;}
    public string Name;
    public object Value;
    public Type TypeOfParam;
}
Class_A 
{
    public Class_A(List<Parameter> parameters)
    {
        // needed code to set variables values
    }
    public int param1{get; set;}
    public double param2{get; set;}
}

Class_B
{
    List<Parameter> params = new List<Parameter>(){new Parameter("param1", 12, typeof(int)), new Parameter("param2", 20.2f, typeof(double))};

    Class_A classA = new Class_A(params);
}

是否可以通过名称访问变量的引用并设置其值?

首选这样的解决方案:

var variable = (parameter.TypeOfVariable)(GetVariableReferenceByName(parameter.Name));
variable = parameter.Value;

而不是像这样的东西:

GetField(parameter.Name).SetValue(parameter.Value);

但是两种解决方案都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

您可以使用Reflection实现此目的

        public void MapValues(object dst, List<Parameter> source)
        {
            var dict = source.ToDictionary(x => x.Name, x => x);

            var fields = dst.GetType().GetProperties().ToList();
            fields.ForEach(x =>
            {
                var param = dict.ContainsKey(x.Name) ? dict[x.Name] : null;
                if(param != null)
                    x.SetValue(dst, param.Value);
            });
        }

        public Class_A(List<Parameter> parameters)
        {
            MapValues(this, parameters);
        }

如果您打算在其他类中使用相同的模式,最好将MapValues移到另一个实用程序类中