2015-10-23 4 views
0

Я использую систему, где имена полей должны иметь префикс с заданным пространством имен динамически.Есть ли способ изменить имена собственности через отражение в C#?

Есть ли способ, что я могу сделать то, что может добиться чего-то вроде этого -

var properties = item.GetType().GetProperties(); 
foreach (var pi in properties) 
{ 
    pi.Name = Settings.Default.NameSpace + "_" + pi.Name; 
} 
+3

Нет, потому что это компилируемый язык. Вам нужно будет использовать ткачество IL. – Jeff

+1

Нет, не изменяя IL, и даже тогда вы играете с огнем, так как другой код может ссылаться на свойство. Почему вы хотите изменить его? Может быть проблема X-Y ... –

+0

Мне любопытно, почему вы хотели бы это сделать. У вас есть несколько классов с одинаковыми именами на нескольких пространствах имен, и вы хотите указать пространство имен, чтобы избежать конфликтов? – oscilatingcretin

ответ

3

Может быть, это проблема X-Y, но я хочу, чтобы ответить на него в любом случае.

Нет, вы не можете. Почему? Посмотрим, что произойдет, если мы сможем может. У нас есть класс:

public class Something { 
    public static object MyProp {get; set;} //I use a static property here just for convenience 
} 

И теперь вы используете какие-то таинственные методы отражения, чтобы изменить свойство IChangedIt.

Something.MyProp = 5; 
MysteriousReflectionMethod(); 
Something.MyProp = 10; 

Будет ли этот код скомпилировать? Никто не знает. После метода MyProp даже существует? Я имею в виду, что компилятор знает, что в Something есть MyProp. Однако после того, как вы измените его имя, такого свойства нет!

Это парадокс!

Да, так что в основном вы не можете ...


Теперь касается проблемы XY ...

Вы можете просто хотите иметь пары ключ-значение, а иногда вы хотите измените ключ. Вы можете использовать Dictionary<TKey, TValue>. Вы можете поместить в него пары ключевых значений, и вы можете изменить ключ! Вот Документы:

https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx

Смежные вопросы