It's actually pretty easy. Simply provide a distinct-ness selector for your method like so:
    public static IEnumerable<TSource> DistinctBy<TSource, TResult>(this IEnumerable<TSource> enumerable, Func<TSource, TResult> keySelector)
    {
        Dictionary<TResult, TSource> seenItems = new Dictionary<TResult, TSource>();
        foreach (var item in enumerable)
        {
            var key = keySelector(item);
            if (!seenItems.ContainsKey(key))
            {
                seenItems.Add(key, item);
                yield return item;
            }
        }
    }
Alternatively, you can create another one to make a generic implementation fo the IEquality comparer:
    public static IEnumerable<TSource> DistinctBy<TSource>(this IEnumerable<TSource> enumerable, Func<TSource, TSource, bool> equalitySelector, Func<TSource, int> hashCodeSelector)
    {
        return enumerable.Distinct(new GenericEqualitySelector<TSource>(equalitySelector, hashCodeSelector));
    }
    class GenericEqualitySelector<TSource> : IEqualityComparer<TSource>
    {
        public Func<TSource, TSource, bool> _equalityComparer = null;
        public Func<TSource, int> _hashSelector = null;
        public GenericEqualitySelector(Func<TSource, TSource, bool> selector, Func<TSource, int> hashSelector)
        {
            _equalityComparer = selector;
            _hashSelector = hashSelector;
        }
        public bool Equals(TSource x, TSource y)
        {
            return _equalityComparer(x, y);
        }
        public int GetHashCode(TSource obj)
        {
            return _hashSelector(obj);
        }
    }