如何使用变量访问c#中的对象成员

时间:2016-03-02 23:36:23

标签: c# object

我有一个返回自定义对象(结构类型)APIStruct user的Web服务。 我有一个变量,其中包含正在检查currentField的当前字段的名称。

现在,在user包含first_namelast_name的情况下,我可以使用user.first_nameuser.last_name来访问该值。但是,是否可以将字段名称保存在变量中并通过变量访问该值?像:

一样工作
var currentField = "first_name";
var value = user.currentField;

显然上面的内容不起作用,有没有办法做到这一点?在过去使用PowerShell等语言时,它就像上面的$currentField = "first_name"; $value = user.$currentField

一样

我已经尝试user.currentField user.(currentField) user[currentField] user.$currentField

4 个答案:

答案 0 :(得分:1)

您可以扩展您的对象类,以支持访问Dictionarypublic class myClass { private Dictionary<string, object> Something = new Dictionary<string, object>(); public object this[string i] { get { return Something[i]; } set { Something[i] = value; } } } 其他属性,可通过explicit indexer访问。

    myClass m = new myClass();

像这样使用:

    m["fist name"] = "Name";
    m["level"] = 2;
    m["birthday"] = new DateTime(2015, 1, 1);

设定值:

    int level = (int)m["level"];
    string firstName = (string)m["first name"];
    DateTime dt = (DateTime)m["birthday"];

获取价值:

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

bm = Basemap(projection = "rotpole",
                  o_lat_p = 36.0,
                  o_lon_p = 180.0,
                  llcrnrlat = -10.590603,
                  urcrnrlat = 46.591976,
                  llcrnrlon = -139.08585,
                  urcrnrlon = 22.661009,
                  lon_0 = -106.0,
                  rsphere = 6370000,
                  resolution = 'l')

fig = plt.figure(figsize=(8,8))
ax = fig.add_axes([0.1,0.1,0.8,0.8])

bm.drawcoastlines(linewidth=.5)

print bm.proj4string

plt.savefig("basemap_map.png")
plt.close(fig)

答案 1 :(得分:0)

你在寻找什么叫做反思。

var type = user.GetType(); // Get type object
var property = type.GetProperty(currentField); // get property info object
var value = property.GetValue(user); // get value from object.

小心 - 与直接属性访问相比,反射速度非常慢。

答案 2 :(得分:0)

您必须使用reflection。创建一个这样的方法:

public static object GetPropValue(object src, string propName)
{
    return src.GetType().GetProperty(propName).GetValue(src, null);
}

并称之为:

string currentField = "first_name";
GetPropValue(user, currentField);

但必须说,这不是你应该用于标准读取对象值的方式。

答案 3 :(得分:-2)

您可能拥有的另一个选项是使用switch语句。类似的东西:

switch (currentField){
    case "first_name":
            value = user.first_name;
            break;
    case "last_name":
            value = user.last_name;
            break;

等...