内部类和接口

时间:2013-12-09 23:42:51

标签: c# asp.net-mvc

我一直在努力弄清楚这是否可行,我有一个我想要内部的类,并从同一个.cs文件中的另一个类调用它。

解释它的最好方法是向你展示我的代码,我已经尝试了嵌套2个类和其他技术,例如使类抽象但我无法使它工作,或者我不知道它是否可能。< / p>

internal class DisplayWeatherAstronomy
{
   public string SunRise           { get; internal set; }
   public string SunSet            { get; internal set; }
   public string MoonRise          { get; internal set; }
   public string MoonSet           { get; internal set; }
} 

public class GetWeatherAstronomy : IGetWeatherAstronomy
{
   internal IEnumerable<DisplayWeatherAstronomy> WeatherAstronomy(string id)
   {
      // code removed

      return displayAstronomy;
   }
}

问题是使用界面,因为intellisense抱怨内部IEnumerable<>

上面的代码位于从mvc app

引用的类库中

任何帮助将不胜感激

乔治

抱歉忘了添加错误

Inconsistent accessibility: return type 'System.Collections.Generic.IEnumerable<Web.Domain.Weather.DisplayWeatherAstronomy>' is less accessible than method 'Web.Domain.Weather.GetWeatherAstronomy.WeatherAstronomy(string)'

Inconsistent accessibility: return type 'System.Collections.Generic.IEnumerable<Web.Domain.Weather.DisplayWeatherAstronomy>' is less accessible than method 'Web.Domain.Weather.IGetWeatherAstronomy.WeatherAstronomy(string)'

接口代码

public interface IGetWeatherAstronomy
{
   IEnumerable<DisplayWeatherAstronomy> WeatherAstronomy(string id);
}

3 个答案:

答案 0 :(得分:3)

这里的问题是该界面的潜在消费者没有足够的可见性来查看该界面引用的内容。接口是公共的,但方法的返回类型引用非公共类型。你需要的是一个内部接口:

internal interface IGetWeatherAstronomy
{
    IEnumerable<DisplayWeatherAstronomy> WeatherAstronomy(string id);
}

然后,该方法的返回值与接口本身具有相同的可访问性。出于同样的原因,公共GetWeatherAstronomy类的方法也必须是内部的。但是......如果你这样做,你仍然会收到错误:

   GetWeatherAstronomy'没有实现接口成员'IGetWeatherAstronomy()'。 'GetWeatherAstronomy.WeatherAstronomy()'无法实现接口成员,因为它不公开。

这是因为接口方法是公共的,即使整个接口是内部的。因此,不要将方法设为公共或内部,而是使用显式接口实现:

public class GetWeatherAstronomy : IGetWeatherAstronomy
{
    IEnumerable<DisplayWeatherAstronomy> IGetWeatherAstronomy.WeatherAstronomy(string id)
    {
        // ...
    }
}

这意味着您必须先将对象转换为接口类型,然后才能调用方法:((IGetWeatherAstronomy)getWeatherAstronomy).WeatherAstronomy(...)而不是getWeatherAstronomy.WeatherAstronomy(...)。但是,至少在某种程度上,一切都保持在内部 - 通过该方法获得该方法的唯一方法是通过内部可访问性获取接口的唯一方法。

答案 1 :(得分:0)

这看起来像是一个访问问题。

您的界面是否定义了WeatherAstronmy方法? Inteface方法默认是公共的,因为它们定义了在其他程序集中使用的契约,因此使用内部方法不会产生很大的意义。

答案 2 :(得分:0)

我的猜测是你宣布了IEnumerable&lt; DisplayWeather天文学&gt;您的IGetWeather天文界面上的成员。

不幸的是,这不起作用。您不能声明接口的内部成员。

您必须从界面中删除该成员,或者使DisplayWeatherAstronomy成为公共类。或完全重构。