C# 如何在T:struct中创建泛型类的动态列表?

C# 如何在T:struct中创建泛型类的动态列表?,c#,generics,dynamic,struct,C#,Generics,Dynamic,Struct,我在创建泛型类型列表时遇到了一个问题,其中类型参数是动态的,并且是结构化的。我认为最好在这里举个例子 public class Container { public List<B<dynamic>> someList = new List<B<dynamic>>(); public void AddToList(Type type) { var genericType = typeof(B<>)

我在创建泛型类型列表时遇到了一个问题,其中类型参数是动态的,并且是结构化的。我认为最好在这里举个例子

public class Container
{
    public List<B<dynamic>> someList = new List<B<dynamic>>();

    public void AddToList(Type type)
    {
        var genericType = typeof(B<>);
        var generic = genericType.MakeGenericType(type);

        someList.Add(Activator.CreateInstance(generic) as B<dynamic>);
    }
}

public class B<T> where T : struct
{

}
我怎样才能让这样的东西在没有

错误CS0453:类型“dynamic”必须是不可为null的值类型,才能将其用作泛型类型或方法“B”中的参数“T”


场景是为我的游戏制作物品系统。游戏本身是实体-组件系统架构,所以游戏中的所有东西都是具有某些组件结构的实体。我正在制作一个Item类,它是ScriptableObjectsort模板,可以保存到xml文件中。我希望Item的每个实例都具有此特定于项的组件,其中包含特定于项的值。但问题是,我不希望该项的每个实例都相同,但我希望该项在指定范围内具有一些随机值。我这样做是为了在我的示例中该项具有ComponentSetupB列表,该列表采用ComponentStructs,并使用反射为每个组件具有的属性创建最小/最大值。在项目中,我需要访问ComponentSetup的一些函数,所以我需要创建ComponentSetup的列表,但不能将其指定为ComponentSetup,因为它只需要t:struct

我不知道您将要实现什么,但如果您使用此方法提供泛型类,则可以将其实例添加到dynamic list中

public class B<T> where T : struct
{
    public dynamic GetDynamic()
    {
        return this;
    }
}

我知道这是线程necro,但为了OP的利益和任何遇到同样情况的人,我试图实现与OP完全相同的事情。 以下是我如何在游戏中解决和实施此问题的:

Unity的文件是单脚本,因此不是真正有效的类型。当我们将脚本或游戏对象拖到检查器时,Unity使用反射从脚本中提取有用的类型和方法

MonoScript提供了GetClass,它返回在中定义的类或结构,但是有一个错误报告,如果该结构是在命名空间中定义的,则返回错误-在我的例子中,它返回null:

因此,对于任何试图实现类似功能的人,如果希望将通用对象作为自定义脚本组件结构传递或填充组件列表,请将条目强制转换为MonoScript并调用GetClass,以避免在命名空间中定义类型。以下是一些PSEDOO实现,以供澄清:

//假设从列表中检索组件列表 componentList中的foreach条目{ 类型ComponentType=作为MonoScript.GetClass的条目; var component=Activator.CreateInstanceComponentType; entity.AddComponentcomponent; }
为什么您需要B的类型参数是动态的?为什么您认为动态是一个结构?动态是一个奇特的词,用于对象加上调用站点上的do magic-它永远不会是结构,也不能是结构。您在这里尝试使用的实际场景是什么?如果我们理解这个场景,我们可能会提供更好的指导。我需要一个通用类B的列表,但是有多个不同的参数structs@MarcGravell我知道什么是动态的,我知道我不能在这种情况下使用它,但除了结构,还有什么类似于动态的吗?