Экспорт нескольких индексированных атрибутов из C# в tlb -> delphi - PullRequest
2 голосов
/ 22 апреля 2020

Я сейчас пытаюсь переопределить ком интерфейс. Этот интерфейс в настоящее время используется в проекте Delphi. Код интерфейса Delphi предположительно генерируется машиной с использованием "TLIBIMP.EXE -P"). В этом автоматически сгенерированном коде есть, например, такой интерфейс:

IDPets = interface(IDispatch)
    ['{679DDC30-232F-11D3-B461-00A024BEC59F}']
    function Get_Value(Index: Integer): Double; safecall;
    procedure Set_Value(Index: Integer; Value: Double); safecall;
    function Get_Pet(Index: Integer): IDPets; safecall;
    procedure Set_Pet(Index: Integer; const Ptn: IDPets); safecall; 
    property Value[Index: Integer]: Double read Get_Value write Set_Value;
    property Pet[Index: Integer]: IDPets read Get_Pet write Set_Pet;
end;

Как вы можете видеть, существует несколько свойств, к которым осуществляется доступ например, поля или массивы с использованием квадратных скобок.

Чего я достиг на данный момент:

В C# можно написать один метод доступа индексатора, используя этот код

[System.Runtime.CompilerServices.IndexerName("Cat")]
public ICat this[int index] { get; set; }

(от: Как экспортировать интерфейс, написанный на C#, чтобы получить Delphi код, сгенерированный TLB )

Вопрос:

Но теперь мне нужно иметь более одного индексатора в классе. И они отличаются только по типу возвращаемого значения, поэтому я не могу просто перегрузить ключевое слово "this".

Так что у кого-нибудь есть идеи, как я могу реализовать это в C#, чтобы я получил файл TLB, который чем можно использовать для генерации Delphi кода, который вы можете увидеть в верхней части этого поста?

Любые идеи высоко ценятся.

Редактировать: я уже наткнулся на этот пост { ссылка } Это своего рода работа, поэтому я могу экспортировать несколько свойств с индексом в Delphi. Но тип этого свойства не правильный. Например: double это не double, это IIndexerDouble (мне нужно было удалить generi c из индексатора для экспорта com, поэтому мне пришлось написать индексатор для каждого типа данных, который я хочу использовать)

1 Ответ

1 голос
/ 22 апреля 2020

Вам не нужно «иметь более одного индексатора в классе». Что вам действительно нужно, так это иметь несколько индексированных свойств в Delphi.

Допустим, вы хотите добавить индексированное свойство Dog. Начните с добавления этих обычных методов в класс C#:

public Dog GetDog(int index)
{
    ...
}

public void SetDog(int index, Dog value)
{
    ...
}

Они сгенерируют это:

function GetDog(Index: Integer): IDDogs; safecall;
procedure SetDog(Index: Integer; const Ptn: IDDogs); safecall; 

Теперь просто добавьте объявление для индексированного свойства:

property Dog[Index: Integer]: IDDogs read GetDog write SetDog;
...