我有一个返回自定义对象(结构类型)APIStruct user
的Web服务。
我有一个变量,其中包含正在检查currentField
的当前字段的名称。
现在,在user
包含first_name
和last_name
的情况下,我可以使用user.first_name
或user.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
答案 0 :(得分:1)
您可以扩展您的对象类,以支持访问Dictionary
个public 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;
等...