我知道我们只能创建类的实例,但我想为我的方法设置一个接口,只是在我的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接口提供。
我怎么能实现这个目标?
谢谢,
答案 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
,则除了realName
和Name
之间没有明确的映射关系之外,您将无法阅读任何人。 FakePerson
更糟糕,因为根本没有为Name
序列化。