如何将枚举赋值给viewmodel属性

本文关键字:viewmodel 属性 赋值 枚举 | 更新日期: 2023-09-27 18:12:32

主要分类:

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.ViewModel.Type'。存在显式转换(您是否缺少强制类型转换?)

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

如何将枚举赋值给viewmodel属性

错误提示您在两个独立的命名空间中有一个名为Type的enum,即使您具有相同的值,仍然不同。

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,               
    });

您的错误消息提示您在NamespaceNamespace.ViewModels中都定义了enum FooType,因此它们之间不能进行隐式转换。我建议你从Namespace.ViewModels中删除定义,只在Namespace.ViewModels中包含对Namespace的引用(使用语句),或者按照Trevor

的建议强制转换类型。

你的查询没有问题。我只是测试了一下。我检查一下你们服务返回的实体。你可以在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; }
}
相关文章: