I know I could have an attribute but that’s more work than I want to go to… and not general enough.
I want to do something like
class Whotsit { private string testProp = 'thingy'; public string TestProp { get { return testProp; } set { testProp = value; } } } ... Whotsit whotsit = new Whotsit(); string value = GetName(whotsit.TestProp); //precise syntax up for grabs..
where I’d expect value to equal ‘TestProp’
but I can’t for the life of me find the right reflection methods to write the GetName method…
EDIT: Why do I want to do this? I have a class to store settings read from a ‘name’, ‘value’ table. This is populated by a generalised method based upon reflection. I’d quite like to write the reverse…
/// <summary> /// Populates an object from a datatable where the rows have columns called NameField and ValueField. /// If the property with the 'name' exists, and is not read-only, it is populated from the /// valueField. Any other columns in the dataTable are ignored. If there is no property called /// nameField it is ignored. Any properties of the object not found in the data table retain their /// original values. /// </summary> /// <typeparam name='T'>Type of the object to be populated.</typeparam> /// <param name='toBePopulated'>The object to be populated</param> /// <param name='dataTable'>'name, 'value' Data table to populate the object from.</param> /// <param name='nameField'>Field name of the 'name' field'.</param> /// <param name='valueField'>Field name of the 'value' field.</param> /// <param name='options'>Setting to control conversions - e.g. nulls as empty strings.</param> public static void PopulateFromNameValueDataTable<T> (T toBePopulated, System.Data.DataTable dataTable, string nameField, string valueField, PopulateOptions options) { Type type = typeof(T); bool nullStringsAsEmptyString = options == PopulateOptions.NullStringsAsEmptyString; foreach (DataRow dataRow in dataTable.Rows) { string name = dataRow[nameField].ToString(); System.Reflection.PropertyInfo property = type.GetProperty(name); object value = dataRow[valueField]; if (property != null) { Type propertyType = property.PropertyType; if (nullStringsAsEmptyString && (propertyType == typeof(String))) { value = TypeHelper.EmptyStringIfNull(value); } else { value = TypeHelper.DefaultIfNull(value, propertyType); } property.SetValue(toBePopulated, System.Convert.ChangeType(value, propertyType), null); } } }
FURTHER EDIT: I am just in code, have an instance of Whotsit and I want to get the text string of the ‘TestProp’ property. It seems kind of weird I know, I can just use the literal ‘TestProp’ – or in the case of my class to datatable function I’d be in a foreach loop of PropertyInfos. I was just curious…
The original code had string constants, which I found clumsy.
No, there’s nothing to do this. The expression
whotsit.TestPropwill evaluate the property. What you want is the mythical ‘infoof’ operator:As it is, you can only use reflection to get the property by name – not from code. (Or get all the properties, of course. It still doesn’t help you with your sample though.)
One alternative is to use an expression tree:
then examine the expression tree to get the property.
If none of this helps, perhaps you could tell us more about why you want this functionality?