既存のジェネリッククラスがあります
public class Foo<T>
{
private T _item;
public Foo(T item){ _item = item;}
}
Tの特定のプロパティを返すメソッドを作成する必要があり
ます。ここに2つの解決策があります。
インターフェイスの作成:
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()); }
インターフェイスを作成する必要がなく、怠惰なので、2番目のソリューションを使用します。すでにfooコンストラクターの呼び出しに1つのパラメーターを追加する必要があります。
さらに、Fooクラスは今でもあらゆる種類のクラスで使用できるので、私はこの方法を好みます。
しかし、それがFuncを使用する良い方法かどうかはわかりませんか?それでも素晴らしくてしっかりしていますか?Funcを使うのはこれが初めてなので、自分に問いかけています。
数ヶ月前、私は古典的なインターフェースを備えた最初のソリューションを使用しました...