2

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# でネイティブに動作し、他のソリューションよりも効率的です。

4

2 に答える 2

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);
    }
}
于 2012-06-26T00:53:17.500 に答える
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; };
    }
}

しかし、これは一種の複雑で慣用的なものではありません。より高いレベルから見れば、おそらくそれを解決するためのよりクリーンな方法があるでしょう。

于 2012-06-26T16:35:29.170 に答える