Вам необходимо объявить интерфейс со свойством индексатора, использовать этот интерфейс в качестве ограничения, и класс аргумента типа должен будет реализовать этот интерфейс для удовлетворения ограничения.
Поскольку вы не контролируете классы, которые хотите использовать, это не сработает.
В качестве альтернативы можно заставить класс Indexer
принимать операции get / set в качестве отдельных параметров:
public class Indexer {
private Func<int, object> getter;
private Action<int, object> setter;
public object this[int index]
{
get { return getter(index); }
set { setter(index, value); }
}
public Indexer(Func<int, object> g, Action<int, object> s)
{
getter = g;
setter = s;
}
}
public static class IndexerExtensions
{
public static Indexer ToIndexer(this DataRow row)
{
return new Indexer(n => row[n], (n, v) => row[n] = v);
}
public static Indexer ToIndexer(this IDataReader row)
{
return new Indexer(n => row[n], (n, v) => row[n] = v);
}
}
Вы можете сделать это:
DataRow row = null;
IDataReader reader = null;
var ind1 = row.ToIndexer();
var ind2 = reader.ToIndexer();
var val1 = ind1[0];
var val2 = ind1[0];