Passing strongly typed property name as argument

c#, lambda, strong-typing

Solution

Based off Jon's answer and this post, it gave me an idea. I passed the `DataValueField` and `DataTextField` as `Expression<Func<TObject, TProperty>>` to my extension method. I created a method that accepts that expression and returns the `MemberInfo` for that property. Then all I have to call is `.Name` and I've got my `string`.

Oh, and I changed the extension method name to `populate`, it was ugly.

public static void populate<TObject, TProperty>(
        this DropDownList source, 
        IEnumerable<TObject> dataSource, 
        Expression<Func<TObject, TProperty>> dataValueField, 
        Expression<Func<TObject, TProperty>> dataTextField) {
    source.DataValueField = getMemberInfo(dataValueField).Name;
    source.DataTextField = getMemberInfo(dataTextField).Name;
    source.DataSource = dataSource;
    source.DataBind();
}

private static MemberInfo getMemberInfo<TObject, TProperty>(Expression<Func<TObject, TProperty>> expression) {
    var member = expression.Body as MemberExpression;
    if(member != null) {
        return member.Member;
    }
    throw new ArgumentException("Member does not exist.");
}

Called like so...

myDropDownList.populate(states,
    school => school.stateCode,
    school => school.stateName);

Problem

I have a collection of `IEnumerable<School>` that is being passed to an extension method that populates a `DropDownList`. I would also like to pass the `DataValueField` and `DataTextField` as an argument but I wanted them to be strongly typed. Basically, I don't want to pass a `string` for the `DataValueField` and `DataTextField` arguments, it's error prone. ``` public static void populateDropDownList<T>(this DropDownList source, IEnumerable<T> dataSource, Func<T, string> dataValueField, Func<T, string> dataTextField) { source.DataValueField = dataValueField; //<-- this is wrong source.DataTextField = dataTextField; //<-- this is wrong source.DataSource = dataSource; source.DataBind(); } ``` Called like so... ``` myDropDownList.populateDropDownList(states, school => school.stateCode, school => school.stateName); ``` My question is, how can I pass the `DataValueField` and `DataTextField` strongly typed as an argument to populateDropDownList?

Original source

Related problems