我有一个已经存在的泛型类
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()); }
传递函数:
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,这就是我问自己的原因!
几个月前,我使用了第一个解决方案,带有经典界面......