在私有类型上动态抛出 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

巴索纳克斯

我需要编写一些代码来克隆任何类型的 HashSet,但该类型事先未知。由于缺少非通用接口(与字典不同,没有 ISet 接口只是一个 ISet<>),我必须使用反射。我决定让 dynamic 为我处理反射工作,但是现在当我运行以下代码时遇到了一个看似非常奇怪的问题(从现实世界的代码中大大简化了):

class Program
{
    static void Main(string[] args)
    {
        HashSet<ReferenceType> source = new HashSet<ReferenceType>();
        ExtMethodsCloning.DeepClone(source);
    }

    private class ReferenceType { }
}

public static class ExtMethodsCloning
{
    public static void SomeCloningMethodThatHappensToCallClear(dynamic baseObj)
    {
        baseObj.Clear();
    }
}

如果您将 DeepClone 移至程序类或将 ReferenceType 设为公开,则它可以工作。它以某种方式需要查看 ReferenceType 才能工作。即使我们只对调用 Clear 方法感兴趣,该方法甚至不在 ReferenceType 上定义,而是在 HashSet<> 上定义。

如何在不必求助于手动进行反射工作的情况下解决此问题?请记住,编译时不知道类型,因此没有泛型。

编辑:我知道在某些时候我必须创建新实例,因此必须调用私有构造函数。如果甚至可以使用动态调用构造函数,我希望在这种情况下会出现错误(并通过使用反射来解决它),但现在只在 HashSet 上调用 Clear 时不会。

亚当·布朗

我不明白这里需要动态。我很确定你可以用泛型做你需要的。

编辑:如何通过反射调用泛型方法:

 static void Main(string[] args)
 {
     var hs1 = new HashSet<SomePrivateClass>();
     CallClear(hs1);
 }

 public static void CallClear(object objectThatIsAHashSet)
 {
     var method = typeof(Program).GetMethod("Clear", BindingFlags.Public | BindingFlags.Static);
     var hsGenericType = objectThatIsAHashSet.GetType().GetGenericArguments()[0];
     var genericMethod = method.MakeGenericMethod(hsGenericType);
     genericMethod.Invoke(null, new[] {objectThatIsAHashSet});
 }

private class SomePrivateClass { }

public static void Clear<T>(HashSet<T> hs)
{
    hs.Clear();
}

编辑 2:为什么它不适用于动态。

基本上,动态只允许访问类型的公共成员。因此,它不能用于调用私有成员或私有类型。基本规则是,如果你不能使用它的类型在一段代码中引用一个方法,你就不能使用动态访问它(即你不能使用动态来破坏封装)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

发生“ Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的第一次机会异常

来自分类Dev

MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

来自分类Dev

'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException''对象'不包含'intEmployeeId'的定义

来自分类Dev

缺少类型Microsoft.CSharp.RuntimeBinder.Binder

来自分类Dev

C#动态-“ RuntimeBinderException”

来自分类Dev

当 T 是私有类或受保护类时,动态访问 List<T>.Count 会抛出 RuntimeBinderException

来自分类Dev

动态List <T> .Add抛出RuntimeBinderException

来自分类Dev

动态List <T> .Add抛出RuntimeBinderException

来自分类Dev

RuntimeBinderException调用动态类型类型的方法

来自分类Dev

错误:*。csproj无法在MonoDevelop上导入“ $(MSBuildBinPath)\ Microsoft.CSharp.targets”

来自分类Dev

VB.NET Azure Functions — Microsoft.CSharp 程序集有什么作用?

来自分类Dev

拦截动态调用以避免RuntimeBinderException

来自分类Dev

Microsoft.CSharp库中的BadImageFormat异常

来自分类Dev

Microsoft.CSharp库中的BadImageFormat异常

来自分类Dev

在视图中访问动态匿名类型时出现RuntimeBinderException

来自分类Dev

C#编译器即服务:Mono.CSharp与Microsoft.CSharp

来自分类Dev

打开项目时找不到Microsoft.CompactFramework.CSharp.targets

来自分类Dev

如何为 Microsoft.codeAnalysis.CSharp 配置 BindingRedirects

来自分类Dev

\MSBuild\16.0\Bin\Microsoft.CSharp.targets 文件未找到

来自分类Dev

为什么“动态” ExpandoObject即使包含属性的定义也会抛出RuntimeBinderException?

来自分类Dev

尝试设置本机属性时,动态关键字抛出RunTimebinderException

来自分类Dev

.Net RunTimeBinderException

来自分类Dev

我正在尝试将对象转换为动态类型,但由于RunTimeBinder异常而转换失败

来自分类Dev

Csharp 等价于有符号字符常量

来自分类Dev

C#Roslyn .NET CORE 3.1 CSharpCompilation动态RuntimeBinder.Binder.Convert错误

来自分类Dev

RuntimeBinderException通过动态将非0的Enum值传递给.Net Com程序集

来自分类Dev

ASP.NET MVC - 将动态 ExpandoObject 从控制器传递到视图时出现 RuntimeBinderException

来自分类Dev

VS 2019-从Microsoft.CodeAnalysis.CSharp.Analyzers看到许多警告AD0001

来自分类Dev

Microsoft Graph CSharp SDK和过滤-如何构造对CreatedDateItem进行过滤的调用?

Related 相关文章

  1. 1

    发生“ Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的第一次机会异常

  2. 2

    MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

  3. 3

    'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException''对象'不包含'intEmployeeId'的定义

  4. 4

    缺少类型Microsoft.CSharp.RuntimeBinder.Binder

  5. 5

    C#动态-“ RuntimeBinderException”

  6. 6

    当 T 是私有类或受保护类时,动态访问 List<T>.Count 会抛出 RuntimeBinderException

  7. 7

    动态List <T> .Add抛出RuntimeBinderException

  8. 8

    动态List <T> .Add抛出RuntimeBinderException

  9. 9

    RuntimeBinderException调用动态类型类型的方法

  10. 10

    错误:*。csproj无法在MonoDevelop上导入“ $(MSBuildBinPath)\ Microsoft.CSharp.targets”

  11. 11

    VB.NET Azure Functions — Microsoft.CSharp 程序集有什么作用?

  12. 12

    拦截动态调用以避免RuntimeBinderException

  13. 13

    Microsoft.CSharp库中的BadImageFormat异常

  14. 14

    Microsoft.CSharp库中的BadImageFormat异常

  15. 15

    在视图中访问动态匿名类型时出现RuntimeBinderException

  16. 16

    C#编译器即服务:Mono.CSharp与Microsoft.CSharp

  17. 17

    打开项目时找不到Microsoft.CompactFramework.CSharp.targets

  18. 18

    如何为 Microsoft.codeAnalysis.CSharp 配置 BindingRedirects

  19. 19

    \MSBuild\16.0\Bin\Microsoft.CSharp.targets 文件未找到

  20. 20

    为什么“动态” ExpandoObject即使包含属性的定义也会抛出RuntimeBinderException?

  21. 21

    尝试设置本机属性时,动态关键字抛出RunTimebinderException

  22. 22

    .Net RunTimeBinderException

  23. 23

    我正在尝试将对象转换为动态类型,但由于RunTimeBinder异常而转换失败

  24. 24

    Csharp 等价于有符号字符常量

  25. 25

    C#Roslyn .NET CORE 3.1 CSharpCompilation动态RuntimeBinder.Binder.Convert错误

  26. 26

    RuntimeBinderException通过动态将非0的Enum值传递给.Net Com程序集

  27. 27

    ASP.NET MVC - 将动态 ExpandoObject 从控制器传递到视图时出现 RuntimeBinderException

  28. 28

    VS 2019-从Microsoft.CodeAnalysis.CSharp.Analyzers看到许多警告AD0001

  29. 29

    Microsoft Graph CSharp SDK和过滤-如何构造对CreatedDateItem进行过滤的调用?

热门标签

归档