如何在给定界面的情况下创建对象?

时间:2012-12-09 20:39:47

标签: c# generics testing

我知道我们只能创建类的实例,但我想为我的方法设置一个接口,只是在我的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接口提供。

我怎么能实现这个目标?

谢谢,

3 个答案:

答案 0 :(得分:2)

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

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

What C# mocking framework to use?

如果您不想使用单元测试解决方案 - 请删除这些标签。

答案 1 :(得分:1)

您可以使用impromptu interface库来实现此目的。

创建一个动态对象,然后使用ActLike<IMyInterface>()使其行为就像实现IMyInterface的类的实例一样。

答案 2 :(得分: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,则除了realNameName之间没有明确的映射关系之外,您将无法阅读任何人。 FakePerson更糟糕,因为根本没有为Name序列化。