C# 将枚举传递给函数无效

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

我正在尝试将enum传递给我的方法,以下是我尝试的方式:

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查询吗: