2016-10-05 46 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