Указывает на функцию, созданную в проекте C #, из общего имени типа в C / CLI

#c -cli

#c -cli

Вопрос:

C /CLI :

 public interface class ITest{
    public:
          virtual void doSomething (){
           }
}

public ref Base {
      ...........
      ...........
}

generic <typename T> where T : ITest
public ref Derived : Base{
    public:
          virtual void doNothing (){
           }
}

public ref AnotherClass {
public:
        generic<class T> where T : Base
    static int justDoThis(){
                //Problem!!
        }
}
  

C# :

В C # есть два класса A и B . A наследуется от ITest и B наследуется от Derived того, где A используется в качестве имени типа. Кроме того, B имеет закрытую переменную типа A . Итак, вызывается функция from main AnotherClass.justDoThis<B>() , где B передается как универсальный тип.

«// Проблема !!» Часть :

Теперь мне нужно создать новый экземпляр B в этом разделе, а также получить доступ к A закрытой переменной B .

Ответ №1:

Итак, если я возьму ваш абзац описания кода C #:

 class A : ITest {}

class B : Derived<A>
{
    private A someVariableOfTypeA;
}

class Program
{
    void Main(string[] args)
    {
        AnotherClass.justDoThis<B>();
    }
}
  

И проблема в том, что вы хотите это сделать:

 public ref AnotherClass {
public:
    generic<class T> where T : Base
    static int justDoThis()
    {
        // Problem!!
        Something^ actuallyB = gcnew Something();
        A^ a = actuallyB->someVariableOfTypeA;
    }
}
  

Проблема № 1. Вы можете разрешить создание новых объектов универсального типа, указав gcnew в качестве другого общего ограничения. (В C # это было бы new .) Для этого потребуется, чтобы у универсального типа был конструктор по умолчанию (т. Е. Без параметров), к Которому вы можете получить доступ с помощью обычного gcnew .

 generic<class T> where T : Base, gcnew
static int justDoThis()
{
    T^ t = gcnew T();
}
  

Проблема № 2: вы не можете получить доступ к закрытым переменным внутри объекта. Вот что значит private . Если вы хотите предоставить justDoThis доступ к A объекту, добавьте соответствующий общедоступный метод или свойство Base . Метод или свойство будут возвращать тип ITest . Вы также можете поместить этот метод / свойство в новый интерфейс (возможно, с именем IHaveAnITestAccessorMethod ) и добавить его в качестве другого общего ограничения, которое B удовлетворяет всем ограничениям.

Обратите внимание, что не принесет никакой пользы, если сделать переменную общедоступной для type B : justDoThis не знает о B , он знает только о T , который является Base конструктором без параметров.

Отказ от ответственности:

  • Я не проверял свой синтаксис с помощью компилятора.
  • Да, вы можете делать что угодно с отражением, но это плохой дизайн. Не делайте этого, исправьте свой код правильным образом.

Комментарии:

1. Привет, я новичок в C / CLI. Спасибо за ваш ответ, но проблема 1 невозможна. Как показывает ошибка при сборке: невозможно использовать gcnew для выделения универсального типа. Я использую safe_cast <TService>(System::Activator::CreateInstance (TService::typeid)). Теперь я хочу сделать 2 вещи. Сначала передайте это значение другой универсальной функции без предложения where. Во-вторых, внутри этой другой функции я хочу использовать функцию переопределения, которая записана в from ITest

2. Что такое TService ? TService В вашем вопросе нет a . Кроме того, пожалуйста, задавайте по одному вопросу за сообщение, не добавляйте больше вопросов к одному и тому же сообщению.

3. Это T. Извините. Я дал неправильное имя универсального типа. Не могли бы вы, пожалуйста, ответить на вопрос. Мне нужен ответ. 🙂