2013-10-09 2 views
1

Ниже моя текущая ситуация ....Отражение в свойствах?

public string Zip { get { return this.GetValue<string>("Zip"); } set { this.SetValue("Zip", value); } } 

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

Редактировать: Благодаря KooKiz я смог сделать шаг дальше, но все же не на 100%.

public string Zip { get { return this.GetValue<string>(); } set { this.SetValue(value); } } 
+0

Вопрос о неподтвержденном вопросе: зачем вам? Если есть много свойств, подобных этому, которые вы хотите определить, для этого требуется генерация кода. T4 входит в состав VS. – Jon

+2

Если вы используете .NET 4.5, вы можете посмотреть атрибут 'CallerMemberName': http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx –

+0

@KooKiz Совершенно изящный. Это очень удобно для ведения журнала. – Khan

ответ

1

Вы можете уточнить свой вопрос. Это слишком расплывчато для меня.

Вы ищете это?

public object DoSomething(Type type, string propertyName) 
{ 
    var somethingWithProperty = Activator.CreateInstance(type, null); 
    foreach (PropertyInfo property in somethingWithProperty.GetType().GetProperties()) 
    { 
     if (property.Name == propertyName) 
     { 
      return property.GetValue(somethingWithProperty, null); 
     } 
    } 

    throw new ArgumentException(string.Format("No property was found was found with this on [{0}] with propertyname [{1}]", type, propertyName)); 
} 

Или это?

public object DoSomething(Func<object> propertyStuff) 
    { 
     return propertyStuff(); 
    } 

Использование:

public void FinallyIDoSomethingWithThatSomething() 
{ 
    // first version 
    DoSomething(typeof(StrangeOtherClass), "MyLittleProperty"); 

    // second version 
    DoSomething(() => new StrangeOtherClass().MyLittleProperty); 
    DoSomething(() => MyPropertyInMyOwnClass); 
} 

Как код-prettifier показывает неправильные цвета для свойств, я приведу их:

public string MyPropertyInMyOwnClass { get { return "Yay or nay."; } } 

Пожалуйста, обратите внимание, что второй вариант больше не подходит для рефрактора: в первой версии при рефакторе StrangeOtherClass, и вы переименуете MyLittleProperty, ваш код сломается во время выполнения, так как вы можете легко забыть переписать строковые параметры функции. В другой версии, по крайней мере, компилятор предоставит вам ошибку.

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

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