如何为viewmodel属性分配枚举?

时间:2014-07-12 13:06:34

标签: c# asp.net-mvc linq enums

主要课程:

public enum FooType
{
  Red,
  Green,
  Blue
}

public class Foo
{
  public int Id { get; set; }
  public FooType Type { get; set; }
  public string FooName { get; set; }
}

查看模型:

public class FooVM
{
  public FooType Type { get; set; }
  public string FooName { get; set; }
}

现在,我想选择我想要使用Linq的那个

_fooService.All().Select(x => new FooVM
             {
               FooName = x.FooName,
               Type = x.Type, // I'm having trouble with this guy. Says I cannot implicitly convert it.
              }
        );

我得到的错误是:

  

无法隐式转换类型' Namespace.Type' to' Namespace.ViewModel.Type'。存在显式转换(您是否错过了演员?)

我有转换它的问题。但我不知道应该做些什么。我错过了什么?任何帮助将非常感激。感谢

3 个答案:

答案 0 :(得分:2)

该错误表明您在2个单独的命名空间中有一个名为Type的枚举,即使您具有相同的值,它们仍然不同。

namespace Namespace.Type
{
    public enum FooType
    {
        Red,
        Green,
        Blue
    }
}

namespace Namespace.ViewModel.Type
{
    public enum FooType
    {
        Red,
        Green,
        Blue
    }
}

如果基础整数值相同或者每个枚举中的值的顺序相同,则可以将一个枚举显式地强制转换为int,并让另一个枚举从int值隐式转换:

_fooService.All()
    .Select(x => new FooVM
    {
       FooName = x.FooName,
       Type = (int)x.Type,               
    });

答案 1 :(得分:1)

您的错误消息表明您已在enum FooTypeNamespace中定义了Namespace.ViewModels,因此无法在它们之间进行隐式转换。我建议您从Namespace.ViewModels中删除定义,并在Namespace中添加对Namespace.ViewModels的引用(使用声明),或按照Trevor

的建议转换类型

答案 2 :(得分:0)

您的查询没有任何问题。我刚试过它。我会检查您的服务返回的实体。您可以在LinqPad中运行它。

void Main()
{
    //create test list
    var fooService = new List<Foo>();
    var random = new Random();
    Enumerable.Range(0,30).ToList().ForEach(i => fooService.Add(new Foo(){Id=i,Type=(FooType)random.Next(0,3),FooName="Foo"+i}));

    //select view models
    fooService.Select(x => new FooVM
             {
               FooName = x.FooName,
               Type = x.Type
              }
        ).Dump();
}

public enum FooType
{
  Red,
  Green,
  Blue
}

public class Foo
{
  public int Id { get; set; }
  public FooType Type { get; set; }
  public string FooName { get; set; }
}

public class FooVM
{
  public FooType Type { get; set; }
  public string FooName { get; set; }
}