C# 将枚举传递给函数无效
我正在尝试将enum传递给我的方法,以下是我尝试的方式:C# 将枚举传递给函数无效,c#,.net,enums,C#,.net,Enums,我正在尝试将enum传递给我的方法,以下是我尝试的方式: public enum Pizza { [Description("Peeporoni")] Peeporoni = 1, [Description("Maxican")] Maxican = 1, [Description("Cheese")] Cheese = 2 } public static string GetType
public enum Pizza
{
[Description("Peeporoni")]
Peeporoni = 1,
[Description("Maxican")]
Maxican = 1,
[Description("Cheese")]
Cheese = 2
}
public static string GetType(Pizza pizza)
{
switch (pizza)
{
case pizza.: //not getting any thing
return pizza.;
case pizza.:
return pizza.
}
}
现在我想调用GetType方法并将特定类型的比萨饼传递给此方法:
GetType(Pizza.Peeporoni); //should return Pepporoni
GetType(Pizza.Maxican); //should return Maxican
我也试过从下面这样做,但仍然不起作用:
public static string GetType(Enum pizza)
{
switch (pizza)
{
case pizza.: //not getting any thing
return pizza.;
case pizza.:
return pizza.
}
}
使现代化
我是这样做的,但我不想这样做,因为我从很多地方调用GetType方法,所以如果比萨饼名称有任何更改,那么我必须在每个地方查找并更改:
public static string GetType(string pizza)
{
switch (pizza)
{
case "Peeporoni": //not getting any thing
return "Peeporoni";
case "Cheese":
return "Cheese";
}
}
GetType("Peeporoni"); //return Pepporoni
GetType("Cheese"); //return Maxican
球门
我的目标是以这样一种方式创建此过程,即如果有一天以pizza的名义出现任何更改,比如Peeporoni成为Pepparoniz,那么我只需在一个地方进行更改。问题在于代码中使用的选择案例,您必须在案例中指定枚举类型,或者,如果要与字符串进行比较,则必须给switch pizza.ToString 我希望你努力实现以下目标:
public static string GetType(Pizza pizza)
{
switch (pizza)
{
case Pizza.Peeporoni:
return Pizza.Peeporoni.ToString();
case Pizza.Maxican:
return Pizza.Maxican.ToString();
case Pizza.Cheese:
return Pizza.Cheese.ToString();
default:
return "";
}
}
public static Pizza GetType(string pizza)
{
switch (pizza)
{
case "Peeporoni":
return Pizza.Peeporoni;
case "Cheese":
return Pizza.Cheese;
default:
return Pizza.Maxican;
}
}
因此,当您按如下方式调用此方法时:
Pizza pizza =Pizza.Cheese;
string pizaType = GetType(pizza);
您将获得pizaType=奶酪
如果您正在寻找一个将接受字符串并返回相应pizza类型的方法,则意味着您可以修改方法签名,如下所示:
public static string GetType(Pizza pizza)
{
switch (pizza)
{
case Pizza.Peeporoni:
return Pizza.Peeporoni.ToString();
case Pizza.Maxican:
return Pizza.Maxican.ToString();
case Pizza.Cheese:
return Pizza.Cheese.ToString();
default:
return "";
}
}
public static Pizza GetType(string pizza)
{
switch (pizza)
{
case "Peeporoni":
return Pizza.Peeporoni;
case "Cheese":
return Pizza.Cheese;
default:
return Pizza.Maxican;
}
}
现在可以像这样调用此方法:
Pizza pizza = GetType("Peeporoni"); // which will give you the type as `Pizza.Peeporoni`
就像我解释的,这是糟糕的编码,每个比萨饼都应该有单独的对象。这个对象应该实现公共接口
public interface IPizza
{
//just example method
public int Price();
public string Name{ get; set; };
}
public class Peperoni: IPizza
{
private string _name = "Peperoni Pizza";
public int Price()
{
return 10;
}
public string Name
{
get { return _name;}
set { _name=value;}
}
}
public class Cheese: IPizza
{
private string _name = "Cheese Pizza";
public int Price()
{
return 8;
}
public string Name
{
get { return _name;}
set { _name=value;}
}
}
// and so on
当用户需要peperoni时
IPizza peperoniPizza = new Peperoni();
Console.WriteLine(peperoniPizza.Name);
如果用户想要不带沙拉的peperoni,这将为您提供灵活性
IPizza peperoniPizzaNoSalami = new Peperoni();
peperoniPizzaNoSalami.Name = "Peperoni pizza without salam";
同样是一个例子,如果你有类DeliveryComPany,他们有方法IsPizzaDelivered。你可以重复使用这门课上的每一个比萨饼
public void IsPizzaDelivered(IPizza pizza)
{
//you should have IsDelivered property in IPizza for this
//after some actions here you set it to true or false.
//you can take the dependencyof the IPizza in the constructor of your Delivery company too.
}
枚举不包含类型,它只包含一些静态数字。所以当你递过比萨饼的时候,你已经有了比萨饼。不确定要获取什么。pizza是参数对象的名称。Pizza是枚举类型的名称。请记住,C是一种区分大小写的语言。编写case Pizza.Peeporoni:和case Pizza.Maxican等。C是区分大小写的。请注意这是一种错误的编码,编写接口IPizza和所有其他pizzasPeperoni等都应该继承它。如果你有30个不同的比萨饼呢?我建议你为.net安装Resharper工具。它提供了许多选择。包括在整个项目中重命名一个单词。它显示了您要重命名的对象,您只需勾选它们即可。非常简单。我试图避免传递这个硬编码的比萨饼类型,这就是为什么我试图传递enum,因为如果比萨饼的名称或任何东西发生任何更改,那么这将导致我的代码中的每个地方都发生更改。难道不可能创建类似于在1个位置更改的内容,而且根本不需要更改吗place@Learning所以使用此代码,您实际上想要完成的是什么?因为从它的声音来看,您试图传入一个枚举值并返回。。。完全相同的枚举值?还是值的字符串表示形式?或者获取一个字符串并返回一个枚举值?您的最终目标是什么?@Abion47我想传递我方法的特定枚举类型,根据传递的枚举类型,我正在进行一些处理并返回一些字符串值,但我关心的是我想使此过程通用,以便如果有一天出现任何更改,如比萨饼名称拼写的更改或任何更改,则需要进行更改仅在1个位置。这是我的目标+1,以获得更干净的代码。我怀疑把名字改成。。。没有意大利腊肠会改变成分也许你想要一个PreparationInstructions字段,但无论如何,这是正确的方向。@ThomasWeller我当然同意这一点。非常感谢你的回答,我真的很感激,很抱歉再次打扰你,但我已经将我的目标包括在我的问题中。你想说点什么吗??@如果你采用我的方法,您只需将意大利香肠的默认名称更改为其他名称。您能帮我完成此linq查询吗: