C# 从类从接口获取的JObject中的原始类访问泛型反序列化方法

C# 从类从接口获取的JObject中的原始类访问泛型反序列化方法,c#,json.net,deserialization,C#,Json.net,Deserialization,我在反序列化一个类时遇到了一个问题,该类中有一个方法,该方法应该在对象反序列化后触发。 为了回答这个问题,我将尽可能地简化这个问题 public class Cat:IAnimal { public string CatBreed{get;set;} public void Sounds() { console.log("Meow") } } public class Dog:IAnimal { public string DogBreed{get;set;} public

我在反序列化一个类时遇到了一个问题,该类中有一个方法,该方法应该在对象反序列化后触发。 为了回答这个问题,我将尽可能地简化这个问题

public class Cat:IAnimal
{
 public string CatBreed{get;set;}
 public void Sounds()
 { 
   console.log("Meow")
 }
}

public class Dog:IAnimal
{
 public string DogBreed{get;set;}
 public void Sounds()
 { 
   console.log("Woof");
 }
}
public interface IAnimal
{
  void Sounds();
}
因此,这两个类在同一个地方被实例化和序列化,并被转发到反序列化,在这里,它是哪个类并不重要,我们只需要触发Sounds方法。 所以这不起作用,因为无法创建接口的实例

JsonConvert.DeserializeObject<IAnimal>(json)
JsonConvert.DeserializeObject(json)
但由于我知道到达的对象肯定会有方法声音(),我尝试将其转换为动态或普通对象,这导致发现JsonConvert正在将对象和动态转换为JObject,并且无法调用方法声音,因为JObject没有定义。如果您为反序列化对象提供特定的类,那么该方法将存在并按预期工作,但为了完全通用,我需要以这种或类似的方式调用它


有没有办法做到这一点?

您是否尝试过请求具体的类而不是接口?DeserializeObject(json)是的,但这不行,因为在实际问题中,有50个左右不同的类具有需要调用的相同方法,所以使用具体的类是行不通的。我认为这个实现可以帮助您,如果我能控制序列化过程,它将帮助您,它是web api之间的通信,因此对象将自动序列化。由于您的
Cat
Dog
对象具有不同的属性集,您可以创建一个自定义转换器,如和中的转换器。要使用反射自动选择具体类,请参见。您是否尝试请求具体类而不是接口?DeserializeObject(json)是的,但这不行,因为在实际问题中,有50个左右不同的类具有需要调用的相同方法,所以使用具体的类是行不通的。我认为这个实现可以帮助您,如果我能控制序列化过程,它将帮助您,它是web api之间的通信,因此对象将自动序列化。由于您的
Cat
Dog
对象具有不同的属性集,您可以创建一个自定义转换器,如和中的转换器。要使用反射自动选择具体类,请参见。