C++ のポインターからメンバーへの変換を C# に正常に変換する方法を研究してきましたが、まだ有用なものは見つかりませんでした。私がこの機能を持っているとしましょう。
typedef int STRUCT::*DEFINED;
protected static Method(STRUCT* sampleStruct, DEFINED pMember)
{
return (sampleStruct->*pMember);
}
->* はメンバーへのポインターであることを調査を通じて学びました。この場合、STRUCT という構造体でメンバ変数のポインタを送信します。Method はどのメンバーがパラメーターとして送信されたかを実際には把握していないため、メンバーへのポインター sampleStruct->*pMember を介してアクセスします。
リフレクションは、このコードを C# やデリゲートに変換するのに役立つと思いますが、実装方法が本当にわからず、同様の例をオンラインで見つけていません。どんな助けでも大歓迎です。
ありがとう、YT
アップデート
これは、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# でネイティブに動作し、他のソリューションよりも効率的です。