有没有办法在C#中查询(Blittable) struct 的对齐?

public static int AlignmentOf<T>() where T : unmanaged
{
    // what do
}

如果没有内置的方法,仅仅是通过反射遍历字段并找到最宽的原语吗?

推荐答案

我搜索了.NET文档,特别是MarshalUnsafe类,但我没有找到这个功能.

而不是使用反射,maybe这样的东西会起作用吗?基本上,看看.NET如何将 struct T与另一个 struct 对齐.

internal struct AlignmentHelper<T> where T : unmanaged
{
    public byte Padding;
    public T Target;
}

public static int AlignmentOf<T>() where T : unmanaged
{
    return (int)Marshal.OffsetOf<AlignmentHelper<T>>(nameof(AlignmentHelper<T>.Target));
}

例如:

struct Example1
{
    public byte A;
    public byte B;
    public int C;
}

[StructLayout(LayoutKind.Sequential, Pack = 2)]
struct Example2
{
    public byte A;
    public byte B;
    public int C;
}

Console.WriteLine(AlignmentOf<Example1>()); // 4
Console.WriteLine(AlignmentOf<Example2>()); // 2

Csharp相关问答推荐

向类注入一个工厂来创建一些资源是一个好的实践吗?

为什么这个Reflection. Emit代码会导致一个DDL ViolationException?

Blazor-从数据库内部服务器提取错误

更新产品但丢失产品ASP.NET Core的形象

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

Rx.Net窗口内部可观测数据提前完成

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如何注册类使用多级继承与接口

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

升级后发出SWITCH语句

Azure函数-在外部启动类中生成配置时出错

正在从最小API-InvocationConext.Arguments中检索参数的FromBodyAttribute

如何使用EPPlus C#在单个单元格中可视化显示多行文字

为什么在使用JsonDerivedType序列化泛型时缺少$type?

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

使用postman 测试配置了身份的.NET 6应用程序

为什么C#中的类型别名不能在另一个别名中使用?