Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何判断收益率回报是否已生成类型?如何创建此类的实例?_C#_Reflection_Types_.net Assembly_Yield Return - Fatal编程技术网

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()获取的。此外,使用直接字段访问操作类型。属性被忽略。实际处理类型的代码是由表达式树在运行时生成的。