2

我一直在研究如何成功地将 C++ 指向成员的指针转换为 C#,但我还没有发现任何有用的东西。假设我有这个功能。

typedef int STRUCT::*DEFINED;

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

我通过研究了解到 ->* 是指向成员的指针。在这种情况下,我们在一个名为 STRUCT 的结构中发送一个成员变量的指针。由于 Method 不确定哪个成员作为参数发送,它通过指向成员的指针 sampleStruct->*pMember 访问它。

我认为Reflection可以帮助将此代码转换为C#,或者可能是Delegates,但我真的不知道如何实现它,我还没有在网上找到任何类似的例子。任何帮助将不胜感激。

谢谢,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 回答