C# C跨类枚举可见性-可能吗?

C# C跨类枚举可见性-可能吗?,c#,class,enums,C#,Class,Enums,所以我有一个类a,它包含一个enum MyEnum,还有一个类B,它引用这个类的不同项目,所以在类B中我有一个 using ClassA; 子句,我可以使用 MyEnum value = MyEnum.EnumValue; 现在在第三个项目中,我有我的Windows窗体,它有一个类似 using ClassB; 现在我可以在ClassB中添加什么来访问windows窗体上的枚举?有可能吗?我希望避免仅仅为了访问枚举而将ClassA添加到表单中 其思想是ClassB在我的表单和ClassA中

所以我有一个类a,它包含一个enum MyEnum,还有一个类B,它引用这个类的不同项目,所以在类B中我有一个

using ClassA;
子句,我可以使用

MyEnum value = MyEnum.EnumValue;
现在在第三个项目中,我有我的Windows窗体,它有一个类似

using ClassB;
现在我可以在ClassB中添加什么来访问windows窗体上的枚举?有可能吗?我希望避免仅仅为了访问枚举而将ClassA添加到表单中


其思想是ClassB在我的表单和ClassA中的功能之间是一种管理器,但我希望能够访问该枚举,因为它使许多任务变得更容易

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

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

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

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

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

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

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

public static EnumB ToEnumB(this EnumA enumAValue) 
{
    EnumB newValue = (EnumB)(int)enumAValue;
}
我希望避免仅仅为了访问枚举而将ClassA添加到表单中

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

如果您不是在谈论生活在不同程序集中的类,那么可以将枚举放在自己的文件中,并将其声明为公共的-这将允许从代码中的任何点访问它,这是枚举的正常做法

更新:

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

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

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

如果您不是在谈论生活在不同程序集中的类,那么可以将枚举放在自己的文件中,并将其声明为公共的-这将允许从代码中的任何点访问它,这是枚举的正常做法

更新:

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

Using子句只是一种快捷方式,可以避免每次需要引用其中定义的元素时都写入名称空间或类

如果你不喜欢写作

ClassA.MyEnum..
你必须写作

using ClassA;
.....
 My Enum....
这是从表单访问ClassA.MyEnum的方法。 无论如何,如果您不喜欢此解决方案,则不能在其他位置重新定义枚举。 您可以创建另一个名为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子句只是一种快捷方式,可以避免每次需要引用其中定义的元素时都编写名称空间或类

如果你不喜欢写作

ClassA.MyEnum..
你必须写作

using ClassA;
.....
 My Enum....
这是从表单访问ClassA.MyEnum的方法。 无论如何,如果您不喜欢此解决方案,则不能在其他位置重新定义枚举。 您可以创建另一个名为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搬到A班以外的地方。

前几天我都投票给了你,因为你的所有评论都帮助我为我的案例找到了最好的解决方案

我最后采用的解决方案是重构所有内容,以便我能够将需要枚举或其他任何内容的所有代码从ClassA转换为ClassB,并让ClassB通过事件向我的主项目报告操作的结果,以便我能够在收到结果时用结果更新UI


我认为这是解决这个问题的最后通牒

因为你的所有评论都帮助我为我的案件找到了最佳解决方案,所以前几天我投票超过了你

我最后采用的解决方案是重构所有内容,以便我能够将需要枚举或其他任何内容的所有代码从ClassA转换为ClassB,并让ClassB通过事件向我的主项目报告操作的结果,以便我能够在收到结果时用结果更新UI


我认为这是解决这个问题的最后通牒

您不能在类之外公开声明枚举吗?然后您可以在使用它所在的名称空间时访问它。@537mfb-我希望避免将ClassA添加到我的表单j中

ust以访问枚举。-为什么?@Buzzz-will会调查这一点——ClassA实际上是一个大项目,我并没有创建它,所以我尽量避免弄乱它it@Ramhound-为什么我只想引用表单中的all项目来访问其中一个类中的一个小枚举?什么是浪费?不能在类之外公开声明枚举?然后,您可以在使用它所在的名称空间时访问它。@537mfb-我希望避免仅为了访问枚举而将ClassA添加到我的表单中。-为什么?@Buzzz-will会调查这一点——ClassA实际上是一个大项目,我并没有创建它,所以我尽量避免弄乱它it@Ramhound-为什么我只想引用表单中的all项目来访问其中一个类中的一个小枚举?我将对此进行调查,这是一个多么浪费的问题——请看我对Buzzzz的评论above@537mfb-我理解您的担忧,但如果您真的需要在ClassA之外的多个地方使用该枚举,它实际上不属于ClassA。你能想出的任何疯狂的解决办法都只会使你的生活变得复杂,使应用程序的设计变得不那么合乎逻辑。没错——但正如我所说,我并没有在A级的地方创建项目——我只是使用it@537mfb-也许只是使用第二个等效枚举和简单转换?我更新了我的答案。有趣的是,这和伊曼内尔的答案有什么不同?似乎Similar将对此进行调查-请参阅我对Buzzzzz的评论above@537mfb-我理解您的担忧,但如果您真的需要在ClassA之外的多个地方使用该枚举,它实际上不属于ClassA。你能想出的任何疯狂的解决办法都只会使你的生活变得复杂,使应用程序的设计变得不那么合乎逻辑。没错——但正如我所说,我并没有在A级的地方创建项目——我只是使用it@537mfb-也许只是使用第二个等效枚举和简单转换?我更新了我的答案。有趣的是,这和伊曼内尔的答案有什么不同?看起来很相似。我会研究这个问题。看看我对Buzzz的评论。你的更新听起来像是一个有趣的解决方案。不过在我的表单上还添加了一个额外的功能。我会尝试各种方法,看看效果如何。我真的不想让tp把项目搞得一团糟,但似乎是唯一的解决方法。我会研究这个问题。看看我对Buzzz的评论更新听起来像是一个有趣的解决方案-尽管在我的表单上仍然添加了一个额外的用法-将尝试所有方法看看效果如何-真的不想让tp弄乱该项目,但似乎是唯一的解决方法-我知道using子句的用途-这不是我的问题-至于将enum移出,请参阅我对Buzzz的评论-将进行调查我理解的映射选项;我只是想给你我所知道的帮助你的所有元素-@537mfb看看给定的示例。thnx-我希望我可以在我的classB命名空间中为它添加一个别名,并通过该别名以表单的形式访问它-会更容易我知道using子句的用途-这不是我的问题-至于将enum移出,请参阅我对上面Buzzz的评论-将查看映射选项,以便我理解;我只是想给你我所知道的帮助你的所有元素-@537MB看一下给定的示例。thnx——我希望我能在我的classB命名空间中为它添加一个别名,并通过该别名以表单的形式访问它——会容易得多