【问题标题】:Extensions Method trying to call protected methods / wrong exhibition of dynamic parameters扩展方法试图调用受保护的方法/动态参数的错误展示
【发布时间】:2013-04-17 18:40:13
【问题描述】:

我有一个名为NIFERepository 的类。它包含一个SaveObject 方法,该方法不返回任何内容并对数据库执行操作。

public class NIFERepository<E>
{
    protected void SaveObject(object saveObject)
    {
        if (saveObject is E)
            this.RepositorySession.Merge(saveObject);
    }
}

1 .我希望创建一个调用此SaveObject() 方法的公共扩展方法,如下所示:

    public static class NIFERepositoryExtensions
    {
        public static T Save<T, E>(this T self, E saveObject) where T : NIFERepository<E>
        {
            self.SaveObject(saveObject);
            return self;
        }
    } 

但受保护的范围不允许我的扩展方法识别它。

有没有办法让这种形式的方法起作用?

2 。我用 2 种类型创建了我的扩展方法:TET 是调用它的实例,E 是我的ProductRepository&lt;Product&gt; 中定义的类型,例如。当我调用此方法时,未显示定义的类型。

我有办法让它工作吗?

【问题讨论】:

  • SaveObject() 应该是通用的,或者至少应该在使用错误类型调用时抛出异常。
  • 我没有在这里输入,但是当对象参数的类型错误时,我的 SaveObject() 会抛出异常。但我希望我的扩展方法美观,在它的调用中显示正确的类型。但它工作正常。谢谢!
  • 不要编辑问题的答案。如果您对自己的问题有答案,请将答案发布为答案
  • 有什么原因你不能添加实现这个扩展方法作为类本身的实际公共成员?

标签: c# extension-methods


【解决方案1】:
  1. 您不能使用扩展方法来违反封装。
    如果类不公开方法,则不能调用它(反射除外)。
    该方法(希望)是protected,这是有原因的;你可能做错了什么。

【讨论】:

  • 我认为扩展方法可以识别扩展类中所有类型的范围。我会在这里尝试另一种方式,谢谢!
  • @Kiwanax 扩展方法与调用静态方法没有什么不同。只是一种合成糖。
  • 真的哈哈。你看到另一种方法来做我想做的事吗? SaveObject() 方法可以识别为扩展方法,但不能在正常情况下识别,如上例?
  • @Kiwanax:不;这是不可能的。
  • @ScottMcKinney:不能。派生类只能通过它们自己类型的限定符访问受保护的成员。扩展方法不会创建自己的类型,因此允许受保护的成员是没有意义的。
【解决方案2】:

受保护的方法在继承的类中可见。 继承也是如此,并创建一个调用基本受保护方法的公共方法,如

public class BaseClass
{
  protected void SomeMethod()
   {

   }
}

public class ChildClass:BaseClass
{
  public void SomeMethodPublic()
        {
          base.SomeMethod()
        }
}

【讨论】:

  • 在这种情况下使用base 关键字有点令人困惑。 SomeMethod 不会被隐藏在ChildClass 中,所以我个人会使用this.SomeMethod() 或(更常见)只是SomeMethod()
  • 这是一个旧线程,但我不得不发表评论。使用 base.SomeMethod() 是可接受的调用,因为该方法位于基类中。使用 this.SomeMethod(),虽然确实有效,但却是一种令人困惑的方式,因为它暗示 SomeMethod 在当前类中。
猜你喜欢
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多