Использование Func<> через интерфейс?

У меня есть уже существующий универсальный класс

public class Foo<T>
{
    private T _item;
    public Foo(T item){ _item = item;}
}

Мне нужно создать метод, который будет возвращать определенное свойство T.
Я вижу здесь два решения.

  1. Создание интерфейса:

    public const string TestVar = "bar";
    public interface INamable { string Name { get; } }
    public class Bar : INamable
    {
        public string Name { get { return TestVar; } }
    }
    
    public class Foo<T> where T : INamable
    {
        private T _item;
        public Foo(T item) { _item = item; }
        public string GetName() { return this._item.Name; }
    }
    
    [TestMethod()]
    public void TestInterface()
    {
        var bar = new Bar();
        var foo = new Foo<Bar>(bar);
        Assert.AreEqual(TestVar, foo.GetName());
    }
    
  2. Прохождение Func:

    public const string TestVar = "bar";
    public class Bar
    {
        public string Name { get { return TestVar; } }
    }
    
    public class Foo<T>
    {
        private T _item;
        private Func<T, string> _funcName;
        public Foo(T item, Func<T, string> funcName) { _item = item; _funcName = funcName; }
        public string GetName() { return _funcName.Invoke(_item); }
    }
    
    [TestMethod()]
    public void TestFunc()
    {
        var bar = new Bar();
        var foo = new Foo<Bar>(bar, b => b.Name);
        Assert.AreEqual(TestVar, foo.GetName());
    }
    

Я выбираю второе решение, так как мне не нужно создавать интерфейс, и я ленив. Просто нужно добавить один параметр к уже вызову конструктора foo.

Более того, класс Foo по-прежнему можно использовать со всеми классами, и я предпочитаю именно так.

НО, я не уверен, что это хороший способ использовать Func? Это все еще красиво и НАДЕЖНО? Это моя первая попытка использовать Func, поэтому я спрашиваю себя!

Пару месяцев назад я использовал первое решение с классическим интерфейсом...

7
задан Cyril Gandon 30 July 2012 в 15:18
поделиться