Reflection &引用;非托管;IL中的泛型参数约束

Reflection &引用;非托管;IL中的泛型参数约束,reflection,f#,cil,il,Reflection,F#,Cil,Il,当我编译以下代码时: type Class1<'T when 'T : unmanaged> = class end type Class2<'T> = class end 类型1= 班尾 类型Class2这些约束位于FSharpSignatureData托管资源中存储的实体数据中。可以使用F#元数据读取器从以下位置浏览它们: 公共静态IList GetFSharpGenericParameterConstraints(类型genericType,i

当我编译以下代码时:

type Class1<'T when 'T : unmanaged> =
    class end

type Class2<'T> =
    class end
类型1=
班尾

类型Class2这些约束位于FSharpSignatureData托管资源中存储的实体数据中。可以使用F#元数据读取器从以下位置浏览它们:

公共静态IList GetFSharpGenericParameterConstraints(类型genericType,int位置)
{
返回GetFSharpGenericParameterConstraints(genericType.GetGenericArguments()[position]);
}
公共静态IList GetFSharpGenericParameterConstraints(类型genericParameter)
{
var declMethod=genericParameter.DeclaringMethod;
var declType=genericParameter.DeclaringType;
var fsAsm=FSharpAssembly.FromAssembly(genericParameter.Assembly);
int pos=genericParameter.GenericParameterPosition;
var实体=所有实体(fsAsm.entities);
if(declMethod!=null)
{
var member=entities.SelectMany(e=>e.MembersOrValues)。首先(m=>m.ReflectionMemberInfo==declMethod);
返回成员.GenericParameters[pos].约束;
}else if(declType!=null)
{
var entity=entities.First(e=>e.ReflectionType==declType);
返回实体.GenericParameters[pos].约束;
}
返回null;
}
私有静态IEnumerable Allenties(IEnumerable实体)
{
return entities.Concat(entities.SelectMany(e=>allenties(e.NestedEntities));
}

bool unmanaged=GetFSharpGenericParameterConstraints(typeof(MyModule.Class1),0).Any(c=>c.IsUnmanagedConstraint);

可能与@Thehenny重复该问题主要是关于行为,并不能完全回答我的问题。对嵌入的签名/优化数据进行了更深入的研究。@kvb是的,我目前正在研究它。@Hans实际上,参数对类型或约束没有任何影响。约束存储在部件中的资源中。幸运的是,已经有一个库来解释这一点,请参阅我的答案。
.class auto ansi serializable nested public Class1`1<T> extends [mscorlib]System.Object

.class auto ansi serializable nested public Class2`1<T> extends [mscorlib]System.Object