gpt4 book ai didi

c# - 从 fieldinfo 获取通用值会引发异常 : "Late bounds operation cannot be performed..."

转载 作者:行者123 更新时间:2023-11-30 13:58:09 25 4
gpt4 key购买 nike

我试图从泛型类中的静态字段获取泛型类型的实例值,它抛出了这个异常:

Late bound operations cannot be performed on fields with types for which Type.ContainsGenericParameters is true

public class ManagerTemplate<Q, T> : IObjectManager
where T : Filmation.Runtime.Engine.ObjectId, new( )
where Q : ManagerTemplate<Q, T>, new( ) {

public readonly static Q Instance = new Q( ); <---- STATIC FIELD
}


private static void FindManagers( ) {
var IObjectManagerType = typeof( IObjectManager );

var managers = IObjectManagerType.Assembly
.GetTypes( )
.Where( t => !t.IsAbstract && t.GetInterfaces().Any( i => i == IObjectManagerType) );

foreach (var manager in managers) {
var fi = manager.GetField( "Instance" );
var instance = fi.GetValue( null ); <--- EXCEPTION
}
}

我尝试使用 GetGenericTypeDefinition,但继续抛出异常。

我已经在谷歌中搜索过,但我还没有找到如何做到这一点......

有人知道怎么做吗?

编辑:同样使用静态属性

这是我已经实现的解决方法,(虽然我想知道是否可以使用反射来完成):

public static Q Instance { get; private set; }

static ManagerTemplate( ) {
Instance = new Q( );
Environment.Managers.Add( Instance );
}

最佳答案

您无法获取 public readonly static Q Instance = new Q( ); 的值来自通用类型定义 ManagerTemplate<Q, T> ,仅仅是因为 Q 没有具体类型.

如何获取泛型类型定义的实例 Q如果您不知道 Q具体类型是什么是?很简单:你不能。

现在......如果你想得到的是一个从ManagerTemplate<Q, T>下降的类型的实例其中泛型类型参数 Q已定义,那么您实际上想要从搜索中排除通用类型参数。

private static IEnumerable<IObjectManager> FindManagers()
{
Type type = typeof(IObjectManager);
IEnumerable<Type> managers = type.Assembly
.GetTypes()
.Where(t => !t.IsAbstract && t.GetInterfaces().Contains(type));

foreach (Type manager in managers)
{
var fi = manager.GetField("Instance", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
if (fi != null &&
!fi.FieldType.IsGenericParameter &&
type.IsAssignableFrom(fi.FieldType))
{
yield return (IObjectManager) fi.GetValue(null);
}
}
}

这将为您提供从 ManagerTemplate<Q, T> 派生的所有类中定义的所有“管理器”定义了什么类型Q是。

关于c# - 从 fieldinfo 获取通用值会引发异常 : "Late bounds operation cannot be performed...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com