zoukankan      html  css  js  c++  java
  • 通过反射的方式来执行静态类的泛型方法

    今天在公司写代码的时候发生了一个问题;

    被调用代码如下:

    public static class CatalogComposition
        {
            private static AggregateCatalog catalogs = new AggregateCatalog();
    
            public static AggregateCatalog AggregateCatalog
            {
                get { return catalogs; }
            }
    
            public static void ComposeParts<T>(T t)
            {
                CompositionContainer compositionContainer = new CompositionContainer(AggregateCatalog);
                try
                {
                    compositionContainer.ComposeParts(t);
                }
                catch (CompositionException ce)
                {
                    throw new CompositionException(ce.Message, ce.InnerException);
                }
            }
        }

    下面是没有纠正错误前的反射代码:

    红色代码为错误代码。
    抛出的异常为: 不能对 ContainsGenericParameters 为 True 的类型或方法执行后期绑定操作。
     try
                {
                    if (viewModel == null)
                    {
                        throw new ArgumentNullException("viewModel");
                    }
                    Type catalogComposition = Assembly.Load(ManifestConst.ARCHSTAR_FRAMEWORK_MEF).GetType(ManifestConst.ARCHSTAR_FRAMEWORK_MEF_CATALOGCOMPOSITION);
                    MethodInfo composePartsMethod = catalogComposition.GetMethod("ComposeParts", BindingFlags.Static | BindingFlags.Public);
                    composePartsMethod.Invoke(catalogComposition, new object[] { viewModel });
                }
                catch (ArgumentNullException ane)
                { }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }

    下面是正确的代码:

    protected void ComposeParts(V viewModel)
            {
                try
                {
                    if (viewModel == null)
                    {
                        throw new ArgumentNullException("viewModel");
                    }
                    Type catalogComposition = Assembly.Load(ManifestConst.ARCHSTAR_FRAMEWORK_MEF).GetType(ManifestConst.ARCHSTAR_FRAMEWORK_MEF_CATALOGCOMPOSITION);
                    MethodInfo composePartsMethod = catalogComposition.GetMethod("ComposeParts", BindingFlags.Static | BindingFlags.Public);
                    composePartsMethod.MakeGenericMethod(new Type[] { typeof(V) }).Invoke(catalogComposition, new object[] { viewModel });
                }
                catch (ArgumentNullException ane)
                { }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }

  • 相关阅读:
    【正则表达式】正则表达式基础语法
    【JavaWeb】实现二级联动菜单
    【JavaWeb】jQuery对Ajax的支持
    MySQL复习值代码知识点(2)
    easyUI+servlet+mysql项目总结
    Android环境配置(Eclipse全开发环境下载)
    jsp+servlet+mysql简单实现用户登陆注册
    java的异常抛出throws和throw的简单使用
    关于Java的多线程Runnable的个人理解(基础,不讲概念)
    Eclipse中代码自动添加注释及代码注释模板
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3123020.html
Copyright © 2011-2022 走看看