【问题标题】:C# cross class enum visibility - Possible?C# 跨类枚举可见性 - 可能吗?
【发布时间】:2012-04-13 10:48:22
【问题描述】:

所以我有一个包含枚举 MyEnum 的类 ClassA,以及一个引用该类(不同项目)的类 ClassB,所以在 ClassB 中我有一个

using ClassA;

子句,我可以使用类似的东西访问该枚举

MyEnum value = MyEnum.EnumValue;

现在在第三个项目中,我有我的 Windows 窗体,它有一个类似的子句

using ClassB;

现在我可以在 ClassB 中添加什么来访问我的 windows 窗体上的枚举?它甚至可能吗?我想避免仅仅为了访问枚举而将 ClassA 添加到我的表单中。

这个想法是 ClassB 是我的表单和 ClassA 中的功能之间的一种管理器 - 但我想访问该枚举,因为它使很多任务变得更容易

【问题讨论】:

  • 你不能在课堂之外公开声明枚举吗?然后你可以在使用它所在的命名空间时访问它。
  • @537mfb - “我想避免为了访问枚举而将 ClassA 添加到我的表单中。” - 为什么?
  • @Buzzz - 会调查的 - ClassA 实际上是一个我没有创建的大项目,所以试图避免弄乱它
  • @Ramhound - 为什么我想在我的表单中引用一个 all 项目只是为了访问其中一个类中的一个小枚举?多么浪费

标签: c# class enums


【解决方案1】:

在这种情况下,合乎逻辑的做法是使枚举独立于 ClassA 并将其公开,以便在整个解决方案中都可用。

编辑

阅读 cmets 后,如果您真的想避免更改 ClassA,您可以尝试创建第二个枚举并将一个值转换为另一个值。例如,在扩展方法中:

public enum EnumB
{
    // make it equivalent to enum in ClassA
}

public static EnumB ToEnumB(this EnumA enumAValue) 
{
    EnumB newValue = (EnumB)(int)enumAValue;
}

【讨论】:

  • 将对此进行调查 - 请参阅上面我对 Buzzzz 的评论
  • @537mfb - 我理解你的担忧,但如果你真的需要在 ClassA 之外的几个地方使用该枚举,它真的不属于 ClassA。你能想出的任何疯狂的变通办法只会让你的生活变得复杂,并使应用程序的设计变得不合逻辑。
  • true - 但就像我说的,我没有创建 A 类所在的项目 - 我只是在使用它
  • @537mfb - 也许只使用第二个等效的枚举和简单的转换?我已经更新了我的答案。
  • 有趣 - 这与 emannelle 的回答有何不同?看起来很相似
【解决方案2】:

我想避免仅仅为了访问枚举而将 ClassA 添加到我的表单中

你不能。如果它在ClassA 所在的程序集中定义,则您必须引用该程序集。

如果您不是在谈论存在于不同程序集中的类,您可以将枚举放在自己的文件中并将其声明为 public - 这将允许从代码中的任何位置访问它(即枚举的常规做法)。


更新:

您可以创建一个包含共享对象的附加项目,例如公共枚举和接口,并在您的其他项目中引用它们。

【讨论】:

  • 将对此进行调查 - 请参阅上面我对 Buzzz 的评论
  • 您的更新听起来是一个有趣的解决方案 - 虽然仍然在我的表单上添加了额外的使用 - 将尝试各种方法看看有什么更好 - 真的不想让那个项目搞砸,但似乎是唯一的解决方法
【解决方案3】:

Using 子句只是避免在每次需要引用其中定义的元素时编写命名空间(或在本例中为类)的捷径。

如果你不喜欢写

ClassA.MyEnum..

你必须写

using ClassA;
.....
 My Enum....

这是从表单访问 ClassA.MyEnum 的方法。
无论如何,如果你不喜欢这个解决方案,你不能在另一个地方重新定义 Enum。
您可以创建另一个名为 ClassB.MyEnum 的枚举,然后将 ClassB.MyEnum 的任何值映射到 ClassA.MyEnum。这是该解决方法的示例,我不知道它是否有用。

public class ClassB
 {
  public enum MyEnum
    {
     MyValue1,
     MyValue2
     }

   public static MyEnum Convert (ClassA.MyEnum originalValue)
    {
     return (MyEnum)Enum.Parse (typeof (MyEnum), originalValue.ToString());
    }
 } 

我建议将 MyEnum 移到 ClassA 之外。

【讨论】:

  • 我知道 using 子句的用途 - 这不是我的问题 - 至于将枚举移出,请参阅上面对 Buzzz 的评论 - 也会查看映射选项
  • 我明白了;只是试图给你我知道的所有元素来帮助你。 :-)
  • @537mfb 看看给出的样本。
  • thnx - 我希望我可以在我的 classB 命名空间中为其添加一个别名,并通过该别名以表单形式访问它 - 会容易得多
【解决方案4】:

前几天我都为你投了赞成票,因为你们所有的 cmets 都帮助我找到了适合我的情况的最佳解决方案。

我最终遵循的解决方案是重构所有内容,以便我设法将需要枚举(或其他任何内容)的所有代码从 ClassA 获取到 ClassB 中,并让 ClassB 通过事件向我的主项目报告操作结果,所以我可以用结果更新 UI。

我认为这最终是解决这个问题的最佳解决方案

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2011-07-27
    • 2013-07-22
    • 2014-02-13
    • 2018-12-28
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多