Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数必须是什么类型才能接受结构的成员?_C# - Fatal编程技术网

C# 参数必须是什么类型才能接受结构的成员?

C# 参数必须是什么类型才能接受结构的成员?,c#,C#,我正在尝试设置一个函数,该函数允许我将结构的一个成员作为参数传递,以便它可以与函数内部的nameof()一起使用。我希望设置一个函数,该函数可以使用Marshal.OffsetOf()返回结构中成员的偏移量,但我希望配置该函数,以便使用nameof()而不是将成员名称硬编码为字符串 我尝试过使用泛型、对象、类型来配置参数,但似乎没有任何效果 static void Main(字符串[]args) { Console.WriteLine(getStructMember(TestStruct.a))

我正在尝试设置一个函数,该函数允许我将结构的一个成员作为参数传递,以便它可以与函数内部的nameof()一起使用。我希望设置一个函数,该函数可以使用Marshal.OffsetOf()返回结构中成员的偏移量,但我希望配置该函数,以便使用nameof()而不是将成员名称硬编码为字符串

我尝试过使用泛型、对象、类型来配置参数,但似乎没有任何效果

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)