簡體   English   中英

將指向成員的C ++指針轉換為C#

[英]Converting C++ pointer to member to C#

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

typedef int STRUCT::*DEFINED;

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

通過研究,我了解到-> *是指向成員的指針。 在這種情況下,我們在名為STRUCT的結構中發送成員變量的指針。 由於Method不能真正確定將哪個成員作為參數發送,因此它通過指向成員的sampleStruct-> * pMember指針進行訪問。

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

謝謝,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#中原生運行,並且比其他解決方案更有效。

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

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);
    }
}

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

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; };
    }
}

但這是一種令人費解的事情,不是慣用的,如果從更高的層次上看,可能有一種更簡潔的解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM