我想知道如何获取方法参数值来自的属性的名称。下面的代码片段显示了我想要做的事情:
Person peep = new Person();
Dictionary<object, string> mapping = new Dictionary<object, string>();
mapping[peep.FirstName] = "Name";
Dictionary<string, string> propertyToStringMapping = Convert(mapping);
if (mapping[peep.FirstName] == propertyToStringMapping["FirstName"])
Console.WriteLine("This is my desired result");
private Dictionary<string, string> Convert(Dictionary<object, string> mapping)
{
Dictionary<string, string> stringMapping = new Dictionary<string, string>();
foreach (KeyValuePair<object, string> kvp in mapping)
{
//propertyName should eqal "FirstName"
string propertyName = kvp.Key??????
stringMapping[propertyName] = kvp.Value;
}
return stringMapping;
}
答案 0 :(得分:1)
您无法以这种方式执行此操作,因为它的工作方式是C#通过调用其get访问器来计算FirstName属性的值,并将其值传递给字典的索引器。因此,您发现FirstName值的方式完全丢失。就像你评估2 + 2的方式一样。 如果你写“x = 2 + 2”,x将具有值4但是没有办法判断它是3 + 1还是2 + 2或5 +( - 1)还是......评估为4。
答案 1 :(得分:0)
我认为最终您需要存储与该属性关联的PropertyInfo对象,或者您在映射对象中存储属性名称的字符串表示形式。您拥有的语法:
mapping[peep.FirstName] = "Name";
将在字典中创建一个条目,其键值等于peep.FirstName属性的值,并且Value等于“Name”。
如果将属性名称存储为如下字符串:
mapping["FirstName"] = "Name";
然后,您可以使用反射来获取对象的“FirstName”属性。但是,您必须将“peep”对象传递给Convert函数。这似乎与你想做的事情有些相反。
您也可能会对表达式感到疯狂,并执行以下操作:
var mapping = new Dictionary<Expression<Action<T>>,string>();
mapping[ p => p.FirstName ] = "Name";
然后在你的转换函数中你可以检查表达式。它看起来像是:
private Dictionary<string,string> Convert(Dictionary<Expression<Action<T>>,string> mapping)
{
var result = new Dictionary<string,string>();
foreach(var item in mapping)
{
LambdaExpression ex = item.Key as LambdaExpression;
string propertyName = ((MemberExpression)ex.Body).Member.Name;
string propertyValue = item.Value;
result.Add(propertyName,proeprtyValue);
}
return result;
}
这或多或少偏离了我的脑海,所以我可能会稍微改变一下表达式。如果这个实现存在问题,请告诉我,我会看看是否可以找到一个功能性的例子。
答案 2 :(得分:0)
我对C#了解不多,但我认为 peep 是一个枚举?至于Java,你可以这样做:
String propertyName = kvp.key.toString()
也许在C#中有类似的东西?
即使窥视不是枚举:我认为没有理由为什么密钥应该是一个任意对象?那么解决方案是使用枚举作为键的类型呢?
另外,我不知道你要做什么,但通常,我不建议你将枚举键转换为字符串。你能做什么用字符串做什么你也不能用枚举?