如何在运行时动态的用一个类实现一个接口?例如:
public interface IAAA
{
string GetName();
}public class BBB
{
public string GetName()
{
return "-----";
}
}
public class Creater
{
public IAAA GetAAA
{
return new BBB();//错误,没有实现IAAA,请教大家如何动态绑定到一个接口
}
}
public interface IAAA
{
string GetName();
}public class BBB
{
public string GetName()
{
return "-----";
}
}
public class Creater
{
public IAAA GetAAA
{
return new BBB();//错误,没有实现IAAA,请教大家如何动态绑定到一个接口
}
}
修正一下
类似单元测试的mock机制,可以动态帮你生成一个无用的接口实现。
{
public string GetName()
{
return "-----";
}
}BBB类必须继承IAAA
public interface IAAA
{
string GetName();
}public class BBB:IAAA
{
public string GetName()
{
return "-----";
}
}
public class Creater
{
public IAAA GetAAA
{
return new BBB();
}
}
?
动态生成代码我知道,可是后期的能绑定接口我还真不知道.-------------------------------------------------------------奇怪了为什么后期不能绑定接口?反序列化不就是这样干的么?
动态生成Assembly,然后动态生成类,然后在load绑定上去。
dynamic mock应该是这么干的。
?
我真不了解你说的dynamic mock.
---------------------啊,不会吧,你从来都不做单元测试么???
难道你是用调试的方法作的单元测试??
类似你可能需要这样的一个接口,接收某人的短信(可能是纯数字),然后根据这个数字来决定如何处理。但是可能公司现在没有"短信接受设备"提供给你测试,代码也完成了,需要测试怎么办,mock模式就是模拟类似的接口,程序员提供一个实现,以方便代码的调试。dynamic mock就是自动帮程序员产生一个实现了接口的对象,只是不能完全取代手工mock,比如更新到数据库的代码不是你写的,你要测试依赖更新到数据库的接口的时候就可以用动态mokc机制。
现在我发发功,召唤思飞大仙,看看能不能召唤那个夜猫子神来回答。
using System.CodeDom;
using System.CodeDom.Compiler;using Microsoft.CSharp;
...namespace CodeDomTest {
public class Creater
{
public static IAAA GetAAA()
{
//create compile unit & namespace
CodeCompileUnit ccu = new CodeCompileUnit();
CodeNamespace cn = new CodeNamespace("CodeDomTest");
ccu.Namespaces.Add(cn); //create class
CodeTypeDeclaration cls = new CodeTypeDeclaration("SonOfBBB");
cls.Attributes = MemberAttributes.Public;
cls.BaseTypes.Add(typeof(BBB));
cls.BaseTypes.Add(typeof(IAAA));
cn.Types.Add(cls);
//define method
CodeMemberMethod method = new CodeMemberMethod();
method.Attributes = MemberAttributes.AccessMask;
method.Name = "IAAA.GetName";
method.ReturnType = new CodeTypeReference(typeof(string));
cls.Members.Add(method); CodeMethodReferenceExpression bref = new CodeMethodReferenceExpression(
new CodeBaseReferenceExpression(), "GetName");
method.Statements.Add(
new CodeMethodReturnStatement(
new CodeMethodInvokeExpression(bref, new CodeExpression[0])
)
); //compile the assembly, create object
CSharpCodeProvider prov = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;
cp.ReferencedAssemblies.Add(
Assembly.GetExecutingAssembly().Location
);
CompilerResults cr = prov.CompileAssemblyFromDom(cp, new CodeCompileUnit[] { ccu });
if (cr.Errors.Count != 0) return null; object obj = cr.CompiledAssembly.CreateInstance("CodeDomTest.SonOfBBB");
return (IAAA)obj;
}
}
}这里实际返回的是动态生成的SonOfBBB的一个实例,这个类同时显示实现了IAAA,并且在GetName里面调用base.GetName方法,间接实现了返回的IAAA.GetName调用BBB.GetName。-----------------------------------------------------------------------------
http://pointlessly.blogspot.com