将指向成员的 C++ 指针转换为 C#
Posted
技术标签:
【中文标题】将指向成员的 C++ 指针转换为 C#【英文标题】:Converting C++ pointer to member to C# 【发布时间】:2012-06-25 22:05:20 【问题描述】:我一直在研究如何成功地将 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# 中本机工作,并且比其他解决方案更高效。
【问题讨论】:
您可以使用Expression Trees 完成类似这样的事情,但它需要比这里发生的 C++ hackery 更多的代码。这可能是您最好以 C# 方式实现功能需求而不是移植原始 C++ 实现的一个领域。 我认为你是对的。我正在审查功能要求,我将尝试重新设计此解决方案。谢谢! 【参考方案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);
【讨论】:
感谢您的回复。我决定重新设计解决方案,而不是强迫 C# 表现得像 C++。您对如何使用委托来模拟指向成员的访问的解释非常有用。谢谢!【参考方案2】:从实现的角度来看,反射可以做一些非常相似的事情:
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; ;
但这有点令人费解且不惯用,如果您从更高的层次来看,可能有一种更简洁的方法来解决它。
【讨论】:
你是对的。似乎试图模仿 C++ 行为非常复杂,而且很难阅读和维护。我正在重新设计解决方案以使用 C# 功能。谢谢!以上是关于将指向成员的 C++ 指针转换为 C#的主要内容,如果未能解决你的问题,请参考以下文章
C++:将派生指针转换为 void 指针,然后转换为抽象指针,并访问成员函数
调用旧版 C API 时,如何在现代 C++ 中正确地将指向结构的指针转换为指向其他结构的指针?
为啥C ++允许将指向基对象的指针转换为派生类的指针[重复]