2012-06-25 93 views
2

我一直在研究如何成功將C++指針轉換成C#,但是我還沒有找到任何有用的東西。假設我有這個功能。將C++指針轉換爲C#成員#

typedef int STRUCT::*DEFINED; 

protected static Method(STRUCT* sampleStruct, DEFINED pMember) 
    { 
     return (sampleStruct->*pMember); 
    } 

我通過研究瞭解到 - > *是一個指向成員的指針。在這種情況下,我們在一個名爲STRUCT的結構中發送一個成員變量的指針。由於Method不確定哪個成員作爲參數發送,它通過指向成員的sampleStruct - > * pMember訪問它。

我認爲Reflection可以幫助將此代碼轉換爲C#或代理,但我真的不知道如何實現它,並且我還沒有在網上找到任何類似的示例。任何幫助將不勝感激。

感謝, YT

UPDATE

這是我如何在C#中實現這一點。

代替結構的,我創建一個枚舉,和類來表示C++結構,如下所示:

C++結構

public struct ServerStats 
{ 
    int serverStat1; 
    int serverStat2; 
    int serverStat3; 
    int serverStat4; 
    int serverStat5; 
} 

現在,在C#:

public enum ServerStatsEnum 
{ 
    serverStat1, 
    serverStat2, 
    serverStat3, 
    serverStat4, 
    serverStat5, 
} 

public class ServerStats 
{ 
    public int[] serverStatsArray;  

    public ServerStats() 
    { 
     int numElementsInEnum = Enum.GetNames(typeof(ServerStatsEnum)).Length; 
     serverStatsArray = new int[numElementsInEnum]; 
    } 
} 

}

現在,我可以通過調用特定枚舉來訪問數組的元素,如下所示:

public static void Operation(ServerStats server1, ServerStats server2, ServerStatsEnum index) 
    { 
     Console.WriteLine("serverStatsArray[{0}] in server1 is {1}", index, server1.serverStatsArray[(int)index]); 
     Console.WriteLine("serverStatsArray[{0}] in server2 is {1}", index, server2.serverStatsArray[(int)index]);   
    } 

這是更多的代碼,但它本身在C#中工作,它比其他解決方案更有效。

+3

可以有所建樹幾分像這樣用[表達式樹(http://msdn.microsoft.com/en-us/library/bb397951.aspx),但它需要更多的代碼一起工作比C++兩輪牛車這去這裏。這可能是您最好以C#方式實現功能需求而不是移植最初的C++實現的一個領域。 –

+0

我認爲你是對的。我正在審查功能要求,我會嘗試重新設計此解決方案。謝謝! – yeremy

回答

1

您可以使用委託來模擬指針到成員的訪問。

class C 
{ 
    public int Method1() { return 1; } 
    public int Method2() { return 2; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     C myC = new C(); 
     Func<C, int> ptrToMember1 = (C c) => { return c.Method1(); }; 
     int i = Method(myC, ptrToMember1); 
    } 

    static int Method(C c, Func<C, int> method) 
    { 
     return method(c); 
    } 
} 
+0

謝謝你的迴應。我決定重新設計解決方案,而不是強制C#像C++一樣行事。你對如何使用委託模擬指針到成員訪問的解釋非常有用。謝謝! – yeremy

0

從實現的角度看,反射可以做一些非常相似:

protected static int Method(MyType obj, PropertyInfo member) 
{ 
    return member.GetValue(obj, null); 
} 

最大的區別是在主叫側。雖然C++可以在編譯時創建成員指針,但您需要等到運行時才能獲得PropertyInfo實例,並且需要將成員名稱作爲字符串傳遞以獲取它。

喜歡的東西是什麼jyoung與代表建議可能的工作:

class Foo 
{ 
    private int m_val; 
    public Func<int> GetValGetter() 
    { 
     return() => { return m_val; }; 
    } 
} 

但是,這是一種令人費解,不地道,而且很可能有解決這個問題,如果你從更高的層次看待它一個更清潔的方式。

+0

你說得對。似乎想模擬C++行爲非常複雜,很難閱讀和維護。我正在重新設計使用C#功能的解決方案。謝謝! – yeremy