我正在编写一个函数,它是从一种对象到另一种对象的映射器。作为Map方法的参数传入的对象应该具有字符串索引器以在对象中找到适当的值(或不是)。我真的不在乎mapper是否获得Dictionary,DataRow,DataReader等。
有没有办法确定传递给方法的参数应该实现字符串索引器?我找不到类似的东西。
如果不可能,我会使用反射将类型转换为可用的类型,但我想知道是否有正确的方法来处理它。
答案 0 :(得分:6)
不,你不能这样做。您可以使用像Andrew这样的界面,或者您可以传入一个Func<T, string>
来检索索引值。
public void ConsumeIndexedFunction<T>(Func<string, T> something)
{
var foo = something("bar");
// do something with foo
}
public void TestMethod(
Dictionary<string, object> myDictionary,
DataTable myDataTable,
IDataReader myDataReader)
{
ConsumeIndexedFunction(x => myDictionary[x]);
ConsumeIndexedFunction(x => myDataTable.Rows[0][x]);
ConsumeIndexedFunction(x => myDataReader[x]);
}
(感谢Michael Meadows将这个想法充实成一个例子。谢谢!)
答案 1 :(得分:5)
您可以创建如下界面:
interface IFoo
{
String this[Int32 index] { get; set; }
}
实现此接口的所有类型都必须实现字符串索引器,如果方法的参数类型为IFoo
,则可以知道它将具有索引器。
答案 2 :(得分:0)
除非您可以将所有对象(或类别)分别传递给映射器实现定义此类索引器的接口,否则您将需要使用反射。
答案 3 :(得分:0)
在这种情况下,界面是否会有所帮助:
interface IImplementMe {
string this[int index]
{
get;
set;
}
}
只需要参数实现接口