2016-10-05 50 views
0

C++/CLI创建的函数:点在C#项目不同于一般类型名在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#中有两班ABA继承自ITestB继承自Derived,其中A用作类型名称。另外,B有一个类型为A的私有变量。因此,从主函数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:您无法访问对象中的私有变量。这就是私人的意思。如果您想要justDoThis访问A对象,请将相应的公共方法或属性添加到Base。该方法或属性将返回类型ITest。您也可以将该方法/属性放在新界面上(可能名称为IHaveAnITestAccessorMethod),并将其添加为另一个通用约束,并且B满足所有约束。

注意,它不会做任何好处就B类型变量市民:justDoThis不知道B,只知道T,这是一个Base具有无参数的构造函数。

免责声明:

  • 我没有检查我的语法与编译器。
  • 是的,你可以用反射做任何事情,但这是一个糟糕的设计。不要那样做,以正确的方式修复你的代码。
+0

你好,我是C++/CLI的新手。感谢您的回复,但问题1是不可能的。正如构建错误时显示的那样:不能使用gcnew来分配泛型类型。我正在使用safe_cast (System :: Activator :: CreateInstance(TService :: typeid))。我现在想做2件事。首先将此遗传传递给另一个没有where子句的泛型函数。其次,在另一个函数中,我想使用覆盖功能,这是从ITest – user6924365

+0

中写入的A什么是“TService”?你的问题中没有“TService”。另外,请每个帖子提问一次,不要在同一帖子中添加更多问题。 –

+0

这是T.对不起。我给出了泛型类型的错误名称。你能回答这个问题吗?我需要答案。 :-) – user6924365