在C#中我知道我们不能将对象分配给Enum。我所追求的功能是在声明Enum时触发事件。
所以没有
enum MyEnum
{
string, int, etc
}
我可以
enum MyEnum
{
classType1, classType2
}
这将允许调用类classType1 / classType2构造函数,这可以(例如)在声明枚举时用于记录。
提出问题的另一种方式可能是
enum MyEnum
{
string1
{
//logic
},
string2
{
//logic
}
}
有解决方法吗?
答案 0 :(得分:1)
您可以将enum
与静态属性一起使用,而不是static class
,它可以与enum
一样使用,但您可以在getter和setter中编写代码。
答案 1 :(得分:1)
U可以使用properties
代替enum
(然后你可以编写你自己的逻辑,这将在分配变量之后/之前调用)。 enum
结构应该用于创建类似标志的东西。
private string _myVar;
public string MyVar
{
get { return _myVar; }
set
{
// logic 1 here
_myVar = value;
// logic 2 here
}
}
答案 2 :(得分:1)
我认为没有解决方法,你的期望与语言不符。例如,考虑一下会发生什么:
if (myEnumValue == MyEnum.classType1)
你的问题意味着在右边会为等式测试实例化一个'classType1'类,然后结果将依赖于那些类型的相等实现。当左边的项目是枚举时,这会令人困惑......但是假设它是'classType1'类型的对象,这意味着左边和右边都是临时对象。
你可以看到这不起作用。
但是......我认为你真正想要的是一个从枚举中创建对象的工厂。提出其他问题的其他问题(对不起)。像这样的枚举意味着一个状态......所以如果你有一个状态,为什么这个状态需要一个枚举?这是一个很大的问题,请查看状态模式。
希望我帮助过。
答案 3 :(得分:1)
枚举是基于Int##
类型的值类型。所以这与询问相同:我可以在int i = 7;
的分配中得到一些逻辑,而直接答案是否是。
除了整数类型之外,你不能将enum
基于任何其他类型。
但您的要求似乎与跟踪实例有关。这很容易与属性。但是您只能为特定属性执行此操作,而不是将其构建到Type中。
答案 4 :(得分:1)
Enums几乎没有带有全面标签的整数。据我所知,你要找的东西不能用枚举来完成。
然而,正如@ Grumbler85所述,可以使用工厂模拟此行为。 工厂是一种特殊类型的对象,用于创建其他对象的实例。
实现工厂的最简单方法是使用switch语句,但存在其他方式(例如反射)。以下是您正在寻找的简单示例:
Class A
{
...
}
Class B
{
...
}
enum eKnownTypes
{
A,
B
}
Class Factory
{
/*
Implement Singleton here
....
*/
public object CreateInstance(eKnownTypes t)
{
/*
Raise any event needed here
...
*/
switch (t):
{
case eKnownTypes.A: return new A(); break;
case eKnownTypes.B: return new B(); break;
}
return null;
}
}
/*
Set Event Handlers here
Factory.Instance.CustomEvent += new EventHandler ...
....
*/
A objectA = Factory.Instance.CreateInstance(eKnownTypes.A) as A;
...
答案 5 :(得分:1)
你可以用枚举来做,但你可以做到
public struct MyType
{
public const int OneValue = 1;
public const int TwoValue = 2;
private static readonly MyType one = new MyType(OneValue);
private static readonly MyType two = new MyType(TwoValue);
private readonly value int;
private MyType(int value)
{
this.value = value;
}
public static One
{
get { return this.one; }
}
public static Two
{
get { return this.two; }
}
public static implicit operator int(MyType source)
{
return source.value;
}
}
为您提供一个类似于枚举但可完全扩展的类。
例如,你可以做var myType = MyType.One;
switch (myType)
{
case MyType.OneValue:
...
case MyType.TwoValue:
...
default:
...
}
实例是不可变的,并且可以使用object
所固有的实现(即参考质量)对其进行准确测试。