如果结构具有 ReadOnlySpan 字段,如何将 ref 结构参数传递给 MethodInfo

cdj*_*djc 5 c# reflection struct

我有一个MethodInfo代表方法的对象,该方法采用 aref struct作为参数,并且该结构有一个ReadOnlySpan<byte>字段。如何通过对象调用该方法MethodInfo?我无法使用,MethodInfo.Invoke因为Invoke需要参数作为object?[]?数组,并且struct带有ReadOnlySpan<byte>字段的参数不能转换为object.

那么如何通过反射调用方法并向其传递一个 ref 结构值,其中该结构具有 type 字段ReadOnlySpan

Jam*_*s T 5

这可以通过 非常简单地实现MethodInfo.CreateDelegate()

下面是一个使用 .NET 5.0 中可用的通用重载之一的示例:

public ref struct MyRefStruct
{
    private ReadOnlySpan<byte> myReadOnlySpan;

    public MyRefStruct(ReadOnlySpan<byte> myReadOnlySpan) =>
        this.myReadOnlySpan = myReadOnlySpan;

    public void Print()
    {
        foreach (byte b in myReadOnlySpan)
        {
            Console.WriteLine(b);
        }
    }
}

public class MyClass
{
    private void PrintMyRefStruct(MyRefStruct myRefStruct) => myRefStruct.Print();
}

delegate void MyDelegate(MyRefStruct myRefStruct);

var myClass = new MyClass();
var myRefStruct = new MyRefStruct(new ReadOnlySpan<byte>(new byte[] { 0, 1 }));

var methodInfo = typeof(MyClass).GetMethod(
    "PrintMyRefStruct",
    BindingFlags.Instance | BindingFlags.NonPublic
);

methodInfo.CreateDelegate<MyDelegate>(myClass)(myRefStruct);
Run Code Online (Sandbox Code Playgroud)