将其他类型分配给特定类型

时间:2020-04-13 07:01:33

标签: c# types casting

我有多个类继承的基类

public class Animal
{
    public int Id { get; set; }

    public static Animal Get(int id)
    {
        return ...
    }
}

public class Cat : Animal
{
    public CatPayload Payload { get; set; }
}

public class Dog : Animal
{
    public DogPayload Payload { get; set; }
}

public class CatPayload
{
    public int Lives { get; set; }
}

public class DogPayload
{
    public bool IsDangerous { get; set; }
}

我只在数据库中存储Animal标识符,所以当我使用静态方法获取它时,我得到了Animal的实例,而我却没有得到{{1}的强类型的实例}。实施此方法的最佳方法是什么?我目前唯一想到的就是检查动物实例的类型是否与任何子类匹配,但是我不确定是否有一些更简单的方法?

2 个答案:

答案 0 :(得分:1)

我发现您的答案缺少一些细节,因此我不知道这是否有帮助,但否则,请用更多详细信息扩展您的答案,尤其是使用这些类的代码部分。

您可以轻松地通过模式匹配进行检查:


// Creates a Cat, casts to an animal type
Animal myAnimal = new Cat(3);

if(myAnimal is Cat castedAnimalToCat)
{
   // myCat is Animal returned true, which means we have a cat object.
   // castedAnimalToCat is now a new variable of type Cat
   Console.WriteLine($"{castedAnimalToCat.CatPayload}");
}

if(myAnimal is Dog castedAnimalToDog)
{
  // ...
}

因此,在您的数据库逻辑中,可以将其强制转换为正确的操作数。 您可以通过反射来做一些更奇妙的事情,但是您始终会担心时间安全性和复杂性。

答案 1 :(得分:1)

1)EF支持继承。本指南说明了如何完成此操作:

Tutorial: Implement Inheritance with EF in an ASP.NET MVC 5 app

2)您还可以考虑对数据模型使用平面结构,其中实体之间使用外键相互引用:

public class Cat
{
    public int AnimalId { get; set; }

    [ForeignKey(nameof(AccountId))]
    public Animal Animal { get; set; }

    public CatPayload Payload { get; set; }
}

3)对于有效负载,您可以使用字符串属性进行持久化,其中包含序列化类的json:

[NotMapped]
[JsonIgnore]
CatPayload Payload { get; set; }

public string PayloadJson
{
    get => Payload == null ? null : JsonConvert.SerializeObject(Payload);
    set => Payload = value == null ? null : JsonConvert.DeserializeObject<CatPayload>(value);
}