У меня есть уже существующий универсальный класс
public class Foo<T>
{
private T _item;
public Foo(T item){ _item = item;}
}
Мне нужно создать метод, который будет возвращать определенное свойство T.
Я вижу здесь два решения.
Создание интерфейса:
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());
}
Прохождение 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, поэтому я спрашиваю себя!
Пару месяцев назад я использовал первое решение с классическим интерфейсом...