2

我知道我们只能创建类的实例,但我想为我的方法设置一个接口,并在我的 Deserialize() 方法中创建一个实例:

 public T Deserialize(string contents)
        {
            Type type = typeof(T);

            var obj = Activator.CreateInstance(type);

我想这样使用它:

var customSerializer = new CustomSerializer<IPerson>();
IPerson person = customSerializer.Deserialize(contents);

它创建什么对象并不重要,它只需要具有我的 T 接口提供的基本属性即可。

我怎么能做到这一点?

谢谢,

4

3 回答 3

2

如果我正确理解您的问题 - 因为您指定了 tags "testing""unit"我相信您正在寻找一个可以mock为给定界面创建一个模拟框架。

有很多框架可供使用,这是一篇很好的文章,可以帮助您做出决定:

使用什么 C# 模拟框架?

如果您不是在寻找单元测试解决方案 - 请删除这些标签。

于 2012-12-09T20:42:53.483 回答
1

您可以通过使用即兴接口库来实现这一点。

创建一个动态对象,然后使用ActLike<IMyInterface>()它使其表现得就像它是实现IMyInterface.

于 2012-12-09T21:03:05.710 回答
0

其他答案已经涵盖了为单元测试创​​建模拟对象。这是关于“在不知道实际类型的情况下反序列化到接口”。

对于一般情况,无法对接口进行反序列化。序列化数据和接口上的属性值之间没有映射关系。

以下示例显示了一些问题:

interface IPerson 
{
  string Name {get;}
}

class Person: IPerson
{
   string realName;
   public string Name 
   {
     get {return realName;} 
     set {realName=value;}
   }
}

class FakePerson : IPerson
{
   public string Name {get {return "Bob";} }
}

现在,如果您进行序列化Person,您将无法读取除 person 之外的任何内容,因为realName和之间没有明确的映射NameFakePerson更糟糕的是,因为根本没有序列化Name

于 2012-12-09T20:56:37.287 回答