Получение имени свойства, из которого получено значение - PullRequest
0 голосов
/ 15 ноября 2008

Я хотел бы знать, как получить имя свойства, из которого получено значение параметра метода. Фрагмент кода ниже показывает, что я хочу сделать:

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;
}

Ответы [ 3 ]

1 голос
/ 15 ноября 2008

Вы не можете сделать это таким образом, так как он работает так, что C # оценивает значение свойства FirstName, вызывая его метод доступа get и передает его значение индексатору словаря. Поэтому способ, которым вы узнали значение FirstName, полностью потерян. Точно так же, как вы оцениваете 2 + 2. Если вы напишите «x = 2 + 2», x будет иметь значение 4, но невозможно будет определить, было ли это 3 + 1, или 2 + 2, или 5 + (-1), или ..., что оценивается 4.

0 голосов
/ 15 ноября 2008

Я не знаю много о C #, но я полагаю, peep - это перечисление? Что касается Java, вы можете сделать:

String propertyName = kvp.key.toString()

Может быть, есть что-то похожее в C #?

И даже если peep не enum: я не вижу причин, почему ключ должен быть произвольным объектом? Поэтому, возможно, решение состоит в том, чтобы использовать просто enum в качестве типа ключа?

Кроме того, я не знаю, что вы пытаетесь сделать, но обычно я бы не советовал вам преобразовывать ключ enum в строку. Что вы можете сделать со строкой, чего не можете сделать и с перечислением?

0 голосов
/ 15 ноября 2008

Я думаю, что в конечном итоге вам нужно будет сохранить либо объект PropertyInfo, связанный со свойством, либо строковое представление имени свойства в вашем отображаемом объекте. Синтаксис у вас есть:

mapping[peep.FirstName] = "Name";

Создаст запись в словаре со значением ключа, равным значению свойства peep.FirstName, и значением, равным «Имя».

Если вы сохраняете имя свойства в виде строки:

mapping["FirstName"] = "Name";

Затем вы можете использовать отражение, чтобы получить свойство "FirstName" вашего объекта. Однако вам придется передать объект «peep» в функцию Convert. Это похоже на то, что вы хотите сделать.

Вы также можете сойти с ума с помощью выражений и сделать что-то вроде:

var mapping = new Dictionary<Expression<Action<T>>,string>();
mapping[ p => p.FirstName ] = "Name";

Тогда в вашей функции Convert вы можете проверить выражение. Это будет выглядеть примерно так:

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;
}

Это в большей или меньшей степени не в моей голове, поэтому я могу немного отключить типы выражений. Если есть проблемы с этой реализацией, дайте мне знать, и я посмотрю, смогу ли я разработать функциональный пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...