Pass property itself to function as parameter in C#

后端 未结 7 1608
春和景丽
春和景丽 2020-12-12 19:25

I am looking for a method to pass property itself to a function. Not value of property. Function doesn\'t know in advance which property will be used for sorting. Simplest w

相关标签:
7条回答
  • 2020-12-12 19:57

    You can pass a property accessor to the method.

    List<Class1> SortBy(List<Class1> toSort, Func<Class1, IComparable> getProp)
    {
        if (toSort != null && toSort.Count > 0) {
            return toSort
                .OrderBy(x => getProp(x))
                .ToList();
        }
        return null;
    }
    

    You would call it like this:

    var result = SortBy(toSort, x => x.maxSpeed);
    

    But you could go one step further and write your own extension method.

    public static class CollectionExtensions
    {
        public static List<TSource> OrderByAsListOrNull<TSource, TKey>(
            this ICollection<TSource> collection, Func<TSource,TKey> keySelector)
    
            if (collection != null && collection.Count > 0) {
                return collection
                    .OrderBy(x => keySelector(x))
                    .ToList();
            }
            return null;
        }
    }
    

    Now you can sort like this

    List<Class1> sorted = toSort.OrderByAsListOrNull(x => x.maxSpeed);
    

    but also

    Person[] people = ...;
    List<Person> sortedPeople = people.OrderByAsListOrNull(p => p.LastName);
    

    Note that I declared the first parameter as ICollection<T> because it must fulfill two conditions:

    1. It must have a Count property
    2. It must be an IEnumerable<T> in order to be able to apply the LINQ method OrderBy.

    List<Class1> is an ICollection<T> but also an array Person[] as many other collections.


    So far, I have shown how you can read a property. If the method needs to set a property, you need to pass it a setter delegate as well

    void ReadAndWriteProperty(Func<Class1, T> getProp, Action<Class1, T> setProp)
    

    Where T is the type of the property.

    0 讨论(0)
提交回复
热议问题