C# Тип как объект с индексатором - PullRequest
1 голос
/ 30 апреля 2020

Рассмотрим ситуацию: у меня есть метод, который использует DataRow:

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

Но теперь у меня есть несколько других типов ввода с индексатором, которые я хочу передать этому методу. St like:

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

Но я не нашел ничего подобного. Я попробовал IDictionary, но это не сработало. Есть ли какой-нибудь супертип типа st, например «Indexable», или что-нибудь, чем я могу заменить «AnyTypeWithIndexer»?

Примечание: мне все еще нужен этот метод для передачи DataRow, а также мой пользовательский класс (который я хочу реализовать ).

Кто-нибудь может помочь?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 30 апреля 2020

Нет, к сожалению, нет интерфейса, который автоматически применяется к "всем классам с индексатором, который принимает строковый аргумент и возвращает объект" .

Что вы можете сделать, однако , для создания «прокси-класса», который сам реализует такой интерфейс:

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));
1 голос
/ 30 апреля 2020

Вы можете использовать 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
...