C#类型为带有索引器的对象

问题描述 投票:1回答:2

考虑一种情况:我有一个使用DataRow的方法:

public void MyMethod (DataRow input)
{
    DoSomething(input["Name1"]);
}

但是现在我想将其他一些带有索引器的输入类型传递给此方法。圣像:

public void MyMethod (AnyTypeWithIndexer input)
{
    DoSomething(input["Name1"]);
}

但是我还没有找到类似的东西。我尝试了IDictionary,但是没有用。是否有任何超级类型,例如“ Indexable”或任何可以替换“ AnyTypeWithIndexer”的东西?

注意:我仍然需要此方法来传递DataRow以及我的自定义类(我要实现)。

有人可以帮忙吗?

谢谢。

c# indexer
2个回答
1
投票

您可以使用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

3
投票

否,不幸的是,没有接口可自动应用于“所有带有带有字符串参数并返回对象的索引器的类”

但是,您可以创建一个实现此类接口的“代理类”你自己:

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));
© www.soinside.com 2019 - 2024. All rights reserved.