2008-11-15 163 views
0

我想知道如何获取方法参数值来自的属性的名称。下面的代码片段显示了我想做的事:获取值来自的属性名称

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

我认为最终您需要存储与该属性关联的PropertyInfo对象,或者存储映射对象中属性名称的字符串表示形式。语法您有:

mapping[peep.FirstName] = "Name"; 

将创建一个字典,等于peep.FirstName财产的价值的关键值的条目,值等于“名称”。

如果存储属性名称一样的字符串:

mapping["FirstName"] = "Name"; 

然后,您可以使用反射来得到你的对象的“名字”属性。但是,您必须将“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; 
} 

这是或多或少的我的头顶,所以我可能有一些表情类型。如果这个实现有问题,请告诉我,我会看看我是否可以制定一个功能性示例。

1

你不能这样做,因为它的工作方式是,C#通过调用get访问和传球评估名字属性的值它的值到字典的索引器。因此,您发现FirstName值的方式完全丢失。就像你评估2 + 2的方式一样。 如果你写“x = 2 + 2”,x的值将是4,但是无法判断它是3 + 1还是2 + 2或5 + (-1)或...评估为4.

0

我对C#不太了解,但我想peep是枚举吗?至于Java,你可以这样做:

String propertyName = kvp.key.toString() 

也许在C#中有类似的东西?

即使窥视不是一个枚举:我看不出为什么键应该是一个任意的对象没有理由?所以也许解决方案就是使用枚举作为键的类型?

此外,我不知道你想做什么,但通常,我不建议你将枚举键转换为字符串。你可以用一个字符串做什么,你也不能用enum做什么?