C# 参数必须是什么类型才能接受结构的成员?
我正在尝试设置一个函数,该函数允许我将结构的一个成员作为参数传递,以便它可以与函数内部的nameof()一起使用。我希望设置一个函数,该函数可以使用Marshal.OffsetOf()返回结构中成员的偏移量,但我希望配置该函数,以便使用nameof()而不是将成员名称硬编码为字符串 我尝试过使用泛型、对象、类型来配置参数,但似乎没有任何效果C# 参数必须是什么类型才能接受结构的成员?,c#,C#,我正在尝试设置一个函数,该函数允许我将结构的一个成员作为参数传递,以便它可以与函数内部的nameof()一起使用。我希望设置一个函数,该函数可以使用Marshal.OffsetOf()返回结构中成员的偏移量,但我希望配置该函数,以便使用nameof()而不是将成员名称硬编码为字符串 我尝试过使用泛型、对象、类型来配置参数,但似乎没有任何效果 static void Main(字符串[]args) { Console.WriteLine(getStructMember(TestStruct.a))
static void Main(字符串[]args)
{
Console.WriteLine(getStructMember(TestStruct.a));//不工作
Console.WriteLine(nameof(TestStruct.a));//可以工作,但是我不能将其用于我的函数
Console.ReadLine();
}
静态字符串getStructMember(类型成员)
{
(成员)的申报表名称;
}
getStructMember()的预期结果应为“a”,但我无法编译,因为我无法确定如何配置此函数的参数。运算符的
nameof
始终计算为字符串,因此您的方法应接受字符串:
static int GetOffSet<T>(string member)
{
...
... Marshal.OffsetOf<T>(member) ...
...
}
static int GetOffSet(字符串成员)
{
...
…封送员(成员)。。。
...
}
你可以这样称呼它:
GetOffset<TestStruct>(nameof(TestStruct.a))
GetOffset(nameof(TestStruct.a))
请注意,您必须指定两次
TestStruct
。如果您只需要使用特定的结构,您还可以通过一些表达式操作来优化(因此不必指定两次struct name)清扫器
private static IntPtr GetOffset<T>(Expression<Func<TestStruct, T>> expr)
{
var memberExpression = (MemberExpression)expr.Body; // Perhaps, add some additional sanity checks.
return Marshal.OffsetOf<TestStruct>(memberExpression.Member.Name);
}
或者更通用的解决方案
private static IntPtr GetOffset<TStruct>(Expression<Func<TStruct, Object>> expr)
{
var memberExpression = (MemberExpression)(((UnaryExpression)expr.Body).Operand);
return Marshal.OffsetOf<TStruct>(memberExpression.Member.Name);
}
private static IntPtr GetOffset(表达式expr)
{
var memberExpression=(memberExpression)((UnaryExpression)expr.Body.操作数);
返回Marshal.OffsetOf(memberExpression.Member.Name);
}
用作
GetOffset(o => o.Value)
GetOffset<TestStruct>(o => o.Value)
GetOffset(o=>o.Value)
您不能这样使用nameof
nameof(member)
将始终返回“member”
。也许你想要一个MemberInfo
?为什么必须使用getStructMember
函数呢。为什么不能只执行Console.WriteLine(nameof(TestStruct.a))代码>?@Sweeper假设我使用MemberInfo,我如何配置我的函数以允许“TestStruct.a”作为参数?我希望设置一个函数,该函数可以使用Marshal.OffsetOf()返回结构中成员的偏移量,但我希望配置该函数,以便使用nameof()而不是像stringYou那样硬编码成员名称。无法直接传递TestStruct.a
。关于infoof
操作符,有一些建议,但是,你能解释一下关于编写函数以获得成员偏移量的部分吗?因为现在您的问题本质上是一个XY问题。Marshal.OffsetOf
直接接受字符串,所以您的方法也应该接受字符串作为参数。然后可以传递nameof(TestStruct.a)
。