C# 如何判断收益率回报是否已生成类型?如何创建此类的实例?
我正在反思一个C# 如何判断收益率回报是否已生成类型?如何创建此类的实例?,c#,reflection,types,.net-assembly,yield-return,C#,Reflection,Types,.net Assembly,Yield Return,我正在反思一个程序集,有一些类型是由收益率生成的,有可靠的方法将它们过滤掉吗 对于由产生的类型,没有默认构造函数。它是类,而不是值类型。如何创建该类的实例 生成的类型名称如下所示: SomeNamespace.RootMode+d_u1,其中RootMode是类名,getmousarrow是其中包含yield return的函数 用例:正在运行的应用程序的完整状态的序列化,包括产生返回语句的状态 更新: yield-return生成的类型有一个公共构造函数,该构造函数将int作为参数。这是用
程序集
,有一些类型是由收益率
生成的,有可靠的方法将它们过滤掉吗
产生的类型
,没有默认构造函数。它是类
,而不是值类型。如何创建该类的实例
SomeNamespace.RootMode+d_u1
,其中RootMode
是类名,getmousarrow
是其中包含yield return
的函数
用例:正在运行的应用程序的完整状态的序列化,包括
产生返回
语句的状态
更新:
yield-return
生成的类型有一个公共构造函数,该构造函数将int
作为参数。这是用于确定IEnumerator
在函数中的位置的状态变量private
和sealed
,它们实现了一组IEnumerator*/IEnumerable*
接口[CompilerGenerated]
属性[CompilerGenerated]
很可能就是您想要的。它不仅用于“迭代器方法”(您正在描述的功能的名称),而且如果您希望过滤掉类型,您可能希望过滤掉所有编译器生成的类型(也包括为匿名方法和async
方法生成的类型)
至于实例化这样一个类的实例,您可以使用反射,但当然您必须标识要传递的参数并使用适当的构造函数重载。如果没有默认构造函数,通常的序列化技术将无法工作;您必须自己实现一些东西来明确地处理这个问题。也就是说,序列化时从类实例中获取适当的值,然后将其传递给构造函数……当然,要完全恢复类的状态,您需要序列化所有私有字段,并在反序列化时再次恢复这些字段,所有操作都是通过反射进行的
我希望实现这一点的价值对您来说非常高,因为成本肯定会很高。:) 由收益率产生?您希望如何检测或使其成为问题?如果是这样的话,为什么不过滤掉foreach或for循环“生成”的任何内容呢?听起来您真正需要担心的是类型是否是匿名的,而不是它是否是由一个yield-return“生成”的。是的,编译器会为每个yield-return语句生成一个新类型(类)。这个类有三个字段uuu state__现在的还有这个,;此类存储IEnumerator的状态,以便在调用IEnumerator(moveNext/current)时知道在何处继续。调用Assembly.GetTypes()函数时,它将包含此类型,我必须将它们筛选出来以单独处理。我还需要能够创建此类型的实例以复制和转换它们的字段(也包括私有字段!)。这些类型是匿名的还是非匿名的?如果它们是匿名的,则属性是只读的,不能更改,也不应该更改。目前,如果没有代码,很难确定什么对您的情况有实际帮助程序集是在运行时编译的。它可以包含各种类型。这些类型是在运行时使用Assembly.GetTypes()获取的。此外,使用直接字段访问操作类型。属性被忽略。实际处理类型的代码是由表达式树在运行时生成的。