【问题标题】:How to use dynamic to eliminateduplicate code如何使用动态消除重复代码
【发布时间】:2010-08-02 07:26:09
【问题描述】:

我尝试使用示例表单http://blogs.msdn.com/b/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx 来消除代码重复。

 if (Categories != null) {
        foreach (var item in Categories)
        {
            if (item.ID != 0)
            {
                Category category = Category.Load(item.ID);
                category.Name = item.Name;
                category.Project = project;
                category.Save();
            }
            else
            {
                if(!String.IsNullOrEmpty(item.Name))
                {
                    Category category = new Category(project, item.Name);
                    category.Save();
                }
            }
        }
}


            if (Priorities != null)
            {
                foreach (var item in Priorities)
                {
                    if (item.ID != 0)
                    {
                        Priority priority = Priority.Load(item.ID);
                        priority.Name = item.Name;
                        priority.Project = project;
                        priority.Save();
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(item.Name))
                        {
                            Priority priority = new Priority(project, item.Name);
                            priority.Save();
                        }
                    }
                }

我正在尝试执行以下操作,但出现错误消息

不能调用非委托类型 在部分

 if (!String.IsNullOrEmpty(item.Name)) 
                { 
                    dynamic newObject = typeDynamic(project, item.Name); 
                    newObject.Save(); 
                } 

SaveObjects(typeof(Category), Categories.ToList(), project);
 SaveObjects(typeof(Priority), Priorities.ToList(), project);

请帮忙。

谢谢。

出了什么问题,我该如何纠正?

 private void SaveObjects(Type type, dynamic currentItems, Project project)
    {
        dynamic typeDynamic = new StaticMembersDynamicWrapper(type);
        foreach (var item in currentItems)
        {
            if (item.ID != 0)
            {
                dynamic classValues = typeDynamic.Load(item.ID);
                classValues.Name = item.Name;
                classValues.Project = project;
                classValues.Save();

            }
            else
            {
                if (!String.IsNullOrEmpty(item.Name))
                {
                    dynamic newObject = typeDynamic(project, item.Name);
                    newObject.Save();
                }
            }
        }

    }

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    通过声明一个公开所有所需共享属性和方法的接口,然后为每个类实现该接口,并编写共享代码以在该接口上工作,这可能会容易得多。

    【讨论】:

      【解决方案2】:

      您已将 typeDynamic 定义为动态类型,但后来尝试将其用作实际类型(将其用作构造函数 typeDynamic(...))。这不是它们的用途,只是使用点 (typeDynamic.someMember) 访问成员。通过使用StaticMembersDynamicWrapper 阅读,它不会让您访问构造函数,只能访问静态成员。您需要在 StaticMembersDynamicWrapper 类中实现 TryInvoke 才能将该类型用作构造函数。将此添加到类中:

      public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
      {
          ConstructorInfo ctor = _type.GetConstructor(args.Select(arg => arg.GetType()).ToArray());
          if (ctor == null)
          {
              result = null;
              return false;
          }
      
          result = ctor.Invoke(args);
          return true;
      }
      

      不是很强大,但对你来说应该足够了。但是,我强烈推荐 ck 或我的其他非动态方法所建议的更简单的方法。


      您可以采用的另一种(非动态)方法是对静态函数使用委托。请参阅我在此问题中的回答,Curious problem involving generics and static methods

      【讨论】:

      • 代码失败 if (!String.IsNullOrEmpty(item.Name)) { dynamic newObject = typeDynamic(project, item.Name); newObject.Save(); }
      猜你喜欢
      • 2012-07-05
      • 2018-08-25
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多