Вы можете использовать атрибут [CallerMemberName]
. Если вы украсите параметр метода этим атрибутом так:
protected object GetValue([CallerMemberName] string columnName = null)
{
return some_table[columnName.Substring(columnName.IndexOf('_') + 1)];
}
protected object SetValue(object value, [CallerMemberName] string columnName = null)
{
return some_table[columnName.Substring(columnName.IndexOf('_') + 1)] = value;
}
Компилятор будет использовать имя члена метода (метода) вместо значения по умолчанию. Таким образом, ваша собственность становится просто:
public string some_column_name
{
get
{
// current method name ("some_column_name") will be passed
// as "column" parameter
return (string)GetValue();
}
set
{
// same here
SetValue(value);
}
}
Другой альтернативой может быть наследование от DynamicObject
:
public class DynamicRow : DynamicObject {
public override bool TryGetMember(GetMemberBinder binder, out object result) {
// this will be called when you access dynamic property
// like x.some_column_name
result = GetValue(binder.Name);
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value) {
// this will be called when you assign dynamic property
// like x.some_column_name = "some value"
SetValue(binder.Name, value);
return true;
}
private DataRow some_table;
protected object GetValue(string columnName) {
return some_table[columnName.Substring(columnName.IndexOf('_') + 1)];
}
protected object SetValue(string columnName, object value) {
return some_table[columnName.Substring(columnName.IndexOf('_') + 1)] = value;
}
}
Тогда вы можете использовать это так:
dynamic x = new DynamicRow();
object val = x.some_column_name;
x.some_column_name = "some value";
Но мне лично это не совсем нравится, потому что вы теряете безопасность всех типов (любая опечатка будет обнаружена только во время выполнения) по сравнению с использованием статического списка свойств, как в первом подходе.