C# 为一个枚举存储多个值

C# 为一个枚举存储多个值,c#,enums,C#,Enums,我在一个类中将其声明为public ENUM_AccDebitCreditDebitCredit{get;set;} 在我的代码中,我尝试从数据表中填充这个enum,如下所示 public enum ENUM_AccDebitCredit { accDR = 1, accCR = 2 } DebitCredit=(ENUM_TransactionType)ENUM.Parse(typeof(ENUM_TransactionType),rsACC_AccountingRules.

我在一个类中将其声明为
public ENUM_AccDebitCreditDebitCredit{get;set;}

在我的代码中,我尝试从数据表中填充这个
enum
,如下所示

public enum ENUM_AccDebitCredit
{
    accDR = 1,
    accCR = 2
}
DebitCredit=(ENUM_TransactionType)ENUM.Parse(typeof(ENUM_TransactionType),rsACC_AccountingRules.Tables[0]。行[0][“DR”].ToString())和(ENUM_TransactionType)ENUM.Parse(typeof(ENUM_TransactionType),rsACC_AccountingRules.Tables[0]。行[0][“CR”].ToString())

我想将多个值存储在
DebitCredit
中,我如何才能做到这一点

我的数据表如下

public enum ENUM_AccDebitCredit
{
    accDR = 1,
    accCR = 2
}

您可以拥有一组
ENUM\u TransactionType
或使用
[Flags]
将每个项目表示为位标志。

您可以拥有一组
ENUM\u TransactionType
或使用
[Flags]
将每个项目表示为位标志。

如果您的意思是希望枚举“混合”多个值,您需要将代码更改为:

DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("DR", typeof(string));
table.Columns.Add("CR", typeof(string));
table.Rows.Add(25, "1","2"); // enum values
此外,您还需要使用按位或
|
运算符,而不是和
&

[Flags]
public enum ENUM_TransactionType
{
   None = 0,
   ttSales = 1,
   ttPurchase = 2,
   ttReturnIn = 4
}

如果您的意思是希望枚举“混合”多个值,则需要将代码更改为:

DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("DR", typeof(string));
table.Columns.Add("CR", typeof(string));
table.Rows.Add(25, "1","2"); // enum values
此外,您还需要使用按位或
|
运算符,而不是和
&

[Flags]
public enum ENUM_TransactionType
{
   None = 0,
   ttSales = 1,
   ttPurchase = 2,
   ttReturnIn = 4
}

关于您最近的编辑,以下是您将如何进行编辑:

ENUM_TransactionType value = ENUM_TransactionType.ttSales | ENUM_TransactionType.ttPurchase;
您可以使用
[Flags]
属性,也可以尝试以下操作:

public enum ENUM_AccDebitCredit
{
    accDR = 1,
    accCR = 2
}

var type1 = (ENUM_AccDebitCredit)int.Parse(rsACC_AccountingRules.Tables[0].Rows[0]["DR"].ToString());

var type2 = (ENUM_AccDebitCredit)int.Parse(rsACC_AccountingRules.Tables[0].Rows[0]["CR"].ToString());

myClass.DebitCard = type1 | type2;
DataTable
中,您可以尝试以下操作:

public enum ENUM_TransactionType
{
    ttSales = 1,
    ttPurchase = 2,
    ttReturnIn = 4,
}

myClass.DebitCard = ENUM_TransactionType.ttSales | ENUM_TransactionType.ttReturnIn;

bool hasSales = myClass.DebitCard & ENUM_TransactionType.ttSales > 0;

这是一个称为位屏蔽的过程。有关此过程背后的数学运算的更多信息,请参见此处:。

关于您最近的编辑,以下是您将如何执行此操作:

ENUM_TransactionType value = ENUM_TransactionType.ttSales | ENUM_TransactionType.ttPurchase;
您可以使用
[Flags]
属性,也可以尝试以下操作:

public enum ENUM_AccDebitCredit
{
    accDR = 1,
    accCR = 2
}

var type1 = (ENUM_AccDebitCredit)int.Parse(rsACC_AccountingRules.Tables[0].Rows[0]["DR"].ToString());

var type2 = (ENUM_AccDebitCredit)int.Parse(rsACC_AccountingRules.Tables[0].Rows[0]["CR"].ToString());

myClass.DebitCard = type1 | type2;
DataTable
中,您可以尝试以下操作:

public enum ENUM_TransactionType
{
    ttSales = 1,
    ttPurchase = 2,
    ttReturnIn = 4,
}

myClass.DebitCard = ENUM_TransactionType.ttSales | ENUM_TransactionType.ttReturnIn;

bool hasSales = myClass.DebitCard & ENUM_TransactionType.ttSales > 0;


这是一个称为位屏蔽的过程。有关此过程背后的数学运算的更多信息,请参见此处:。

如果希望枚举的行为类似于标志,则可以使用
[Flags]
属性标记枚举的可能重复项。但是,您需要像1、2、4这样的值(除非Return实际上是Sales和Purchase,这似乎不太可能),并使用
|
将它们组合起来。如果您希望DebitCredit成为一个数组,请查看我需要从数据表值中填充可能的重复项,如果您希望它的行为类似于标志,请使用
[Flags]
属性标记您的枚举。但是,如果希望DebitCredit成为一个数组,则需要像1、2、4这样的值(除非Return实际上同时是Sales和Purchase,这似乎不太可能),并使用
组合它们,签出我需要从Datatable值中填写Show我可以从
Datatable中分配
myclass.DebitCard
吗谢谢,但不是
ttSales and ttPurchase
存储在
myclass中的值。DebitCard
ttReturnIn
谢谢你的回答,但不是显示的值
3
@Dotnet这是正确的。要测试一个值,您可以这样做:
if(myClass.DebitCard&ENUM_AccDebitCredit.accDR>0){/*…*/}
我如何从
数据表中分配
myclass.DebitCard
谢谢,但不是
ttSales和ttPurchase
存储在
myclass.DebitCard
中的值。DebitCard
ttReturnIn
谢谢您的回答,但它显示的值不是
3
@Dotnet,这是正确的。要测试一个值,您可以这样做:
if(myClass.DebitCard&ENUM_AccDebitCredit.accDR>0){/*…*/}
我需要从datatable分配值,是吗possible@Dotnet当然如果数据列是带有FLAGS属性的枚举类型,并且您做了整个<代码> <代码/> OR,则没有问题。@ Mat IasFaseReMaster,我会考虑将属性设为可空值而不是<代码> No.< /代码> .Dayiel.AuthWaly,然后您可能会有不必要的空引用异常,当检查
.None
0
就足够了。@DanielA.White Null或“None”有不同的含义。Null表示“未赋值”,“无”表示“无值”。在位操作中,您的建议增加了复杂性,因为如果它为空,我无法执行“SomeEnum.HasFlag(…)”。在这种情况下,没有比这更具语义的了。在其他情况下,我会使用一个null,我需要从datatable中赋值,是吗possible@Dotnet当然如果数据列是带有FLAGS属性的枚举类型,并且您做了整个<代码> <代码/> OR,则没有问题。@ Mat IasFaseReMaster,我会考虑将属性设为可空值而不是<代码> No.< /代码> .Dayiel.AuthWaly,然后您可能会有不必要的空引用异常,当检查
.None
0
就足够了。@DanielA.White Null或“None”有不同的含义。Null表示“未赋值”,“无”表示“无值”。在位操作中,您的建议增加了复杂性,因为如果它为空,我无法执行“SomeEnum.HasFlag(…)”。在这种情况下,没有比这更具语义的了。在其他情况下,我会使用null。