考虑一种情况:我有一个使用DataRow的方法:
public void MyMethod (DataRow input)
{
DoSomething(input["Name1"]);
}
但是现在我想将其他一些带有索引器的输入类型传递给此方法。圣像:
public void MyMethod (AnyTypeWithIndexer input)
{
DoSomething(input["Name1"]);
}
但是我还没有找到类似的东西。我尝试了IDictionary,但是没有用。是否有任何超级类型,例如“ Indexable”或任何可以替换“ AnyTypeWithIndexer”的东西?
注意:我仍然需要此方法来传递DataRow以及我的自定义类(我要实现)。
有人可以帮忙吗?
谢谢。
您可以使用dynamic
类型,但是您需要注意dynamic
的缺点,例如由于DLR而导致的性能缺点,以及类型安全性应由您自己承担的事实
public class WithIndexer
{
public int this[string key] => 42;
}
public static async Task Main()
{
Dictionary<string, int> a = new Dictionary<string, int>();
a.Add("meow", 41);
Foo(a, "meow");
Foo(new WithIndexer(), "key");
}
private static void Foo(dynamic indexed, string key)
{
Console.WriteLine(indexed[key]);
}
输出:
41
42
否,不幸的是,没有接口可自动应用于“所有带有带有字符串参数并返回对象的索引器的类”。
但是,您可以创建一个实现此类接口的“代理类”你自己:
public interface IStringToObjectIndexable
{
object this[string index] { get; set; }
}
class DataRowWrapper : IStringToObjectIndexable
{
private readonly DataRow row;
public DataRowWrapper(DataRow row) => this.row = row;
public object this[string index]
{
get => row[index];
set => row[index] = value;
}
}
MyMethod现在可以声明如下:
public void MyMethod(IStringToObjectIndexable input)
{
DoSomething(input["Name1"]);
}
// Compatibility overload
public void MyMethod(DataRow input) => MyMethod(new DataRowWrapper(input));