использовать Dynami c с наследованием, чтобы позволить пользователю создать любую сигнатуру метода с фиксированным именем? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть базовый класс, который реализует большинство вещей, которые мне нужны. Я хочу, чтобы пользователь API написал унаследованный класс с функцией, которая могла бы иметь любую подпись, но фиксированное имя.

Что-то, что концептуально будет работать как

(ValueTuple out) Act(ValueTuple in)

для неограниченного количества выбранных пользователем аргументов, чтобы один пользователь API мог написать что-то вроде:

(bool, Message) Act(List<Packet> ps)

, а другой мог бы написать что-то вроде:

List<OtherMessage> Act(Packages ps, Status s)

Я хотел бы, чтобы они написали только одну такую ​​функцию для каждого наследника класса. В настоящее время я использую аннотацию [Act], чтобы узнать, какая функция была объявлена ​​пользователем, однако пользователям не ясно, нужно ли ей писать ее, глядя на базовый класс.

Можем ли мы сделать ее наследующей? некоторый объект Dynami c (Expando) или иметь поле Dynami c для достижения такого поведения, то есть базовый класс, такой как (псевдокод):

class Base : DynamicObject {
    public virtual dynamic Act;
}

, который пользователи могут перегружать чем-то вроде (псевдокод):

class Client : Base {
    public new List<OtherMessage> Act(Packages ps, Status s){ return null; }
}
...