我正在开发一个广泛使用XML配置文件的项目,我想通过共享代码的通用实现将一些事情提升到新的水平。
问题是,在我的五个类中,两个处理“描述”网格视图的方式不同。 此网格视图显示具有各种列的相应类型的对象。
另外值得注意的是:数据是通过数据记录传递的,因此GUI无法直接访问源对象。
这是我目前“尝试”获取动态数据,使用相当愚蠢的黑客(不起作用)
GetObjectData( MyClass myObject, string[] dataToGet)
{
List<string> dataToReturn = new List<string>();
foreach (string propertyName in dataToGet)
{
try
{
Label tempLabel = new Label();
tempLabel.DataBindings.Add("Text", myObject, propertyName);
dataToReturn.Add(tempLabel.Text);
}
catch { dataToReturn.Add(""); }
}
}
必须有办法做到这一点,但我不确定它会被称为什么,或者如何处理这个问题。
答案 0 :(得分:1)
您可以使用Reflection以这种方式获取属性值:
public void GetObjectData(MyClass myObject, string[] dataToGet)
{
List<string> dataToReturn = new List<string>();
Type type = myObject.GetType();
foreach (string propertyName in dataToGet)
{
try
{
PropertyInfo pInfo = type.GetProperty(propertyName);
var myValue = pInfo.GetValue(myObject, null);
dataToReturn.Add(Convert.ToString(myValue));
}
catch
{ dataToReturn.Add("");
}
}
}
希望这对你有所帮助..你可以使用dictionay
来保存你的回报而不是字符串列表。
供参考:
Use reflection to get the value of a property by name in a class instance
Set property Nullable<> by reflection
Reflection - get attribute name and value on property
答案 1 :(得分:1)
如果您使用.net framework 4
,也可以使用动态类型 public void GetObjectData(dynamic myObject, string[] dataToGet)
{
List<string> dataToReturn = new List<string>();
foreach (string propertyName in dataToGet)
{
try
{
dataToReturn.Add(Convert.ToString(myObject.propertyName));
}
catch
{ dataToReturn.Add("");
}
}
}