Вы можете уточнить свой вопрос. Это слишком расплывчато для меня.
Вы ищете это?
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
, ваш код сломается во время выполнения, так как вы можете легко забыть переписать строковые параметры функции. В другой версии, по крайней мере, компилятор предоставит вам ошибку.
Если вы предоставите дополнительную информацию, я могу написать более конкретный ответ.
Вопрос о неподтвержденном вопросе: зачем вам? Если есть много свойств, подобных этому, которые вы хотите определить, для этого требуется генерация кода. T4 входит в состав VS. – Jon
Если вы используете .NET 4.5, вы можете посмотреть атрибут 'CallerMemberName': http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx –
@KooKiz Совершенно изящный. Это очень удобно для ведения журнала. – Khan