如何在运行时动态的用一个类实现一个接口?例如:
public interface IAAA
{
   string GetName();
}public class BBB
{
   public string GetName()
   {
     return "-----";
   }
}
public class Creater
{
    public IAAA GetAAA
    {
        return new BBB();//错误,没有实现IAAA,请教大家如何动态绑定到一个接口
    }
}

解决方案 »

  1.   

    public IAAA GetAAA ==> public IAAA GetAAA()
    修正一下
      

  2.   

    发射 技术楼主看看petshop就明白了
      

  3.   

    你的类BBB必需要从IAAA继承才能使用!
      

  4.   

    虽然你的BBB类中有和IAAA接口一样的GetName,但是因为BBB没有显式的继承IAAA,也没有隐式的继承IAAA,所以new BBB()这句话,不能做为IAAA的子类被返回.换句话说,如果一个类没有从另一个类或接口继承(显式的或隐式的),那么就不能按那个类转换.
      

  5.   

    楼上的不是吧,.net没有那么弱吧?
    类似单元测试的mock机制,可以动态帮你生成一个无用的接口实现。
      

  6.   

    DotNetMock,配合NUnit使用的。开源,但是我没有什么时间去剖析如何实现的,好像是动态生成代码,具体不是太清楚了。
      

  7.   

    mock对象在单元测试比较有用,就是不需要你自己去实现接口,其提供一个无用的替身实现。
      

  8.   

    public class BBB:IAAA
    {
       public string GetName()
       {
         return "-----";
       }
    }BBB类必须继承IAAA
      

  9.   

    运行时能动态生成代码 +动态编译就可以定义一个类继承BBB,实现IAAA,就可以实现类似功能了,但是我时间有限,不知道是否是最方便的正解。类似Java就提供了代理类来很方便的实现类似功能。
      

  10.   

    完整为
    public interface IAAA
    {
       string GetName();
    }public class BBB:IAAA
    {
       public string GetName()
       {
         return "-----";
       }
    }
    public class Creater
    {
        public IAAA GetAAA
        {
            return new BBB();
        }
    }
      

  11.   

    回复人:hbxtlhx(平民百姓) ( 三星(高级)) 信誉:112  2007-02-09 15:46:33  得分:0

    动态生成代码我知道,可是后期的能绑定接口我还真不知道.-------------------------------------------------------------奇怪了为什么后期不能绑定接口?反序列化不就是这样干的么?
    动态生成Assembly,然后动态生成类,然后在load绑定上去。
    dynamic mock应该是这么干的。
      

  12.   

    我真不了解你说的dynamic mock.
      

  13.   

    flyforlove(为情飞) 给一点代码来看看喂,带带我们这些.net的新手呀。
      

  14.   

    petShop?里面用的可是动态编译
      

  15.   

    回复人:hbxtlhx(平民百姓) ( 三星(高级)) 信誉:112  2007-02-09 16:09:47  得分:0

    我真不了解你说的dynamic mock.
    ---------------------啊,不会吧,你从来都不做单元测试么???
    难道你是用调试的方法作的单元测试??
      

  16.   

    回:hbxtlhx(平民百姓) 
    类似你可能需要这样的一个接口,接收某人的短信(可能是纯数字),然后根据这个数字来决定如何处理。但是可能公司现在没有"短信接受设备"提供给你测试,代码也完成了,需要测试怎么办,mock模式就是模拟类似的接口,程序员提供一个实现,以方便代码的调试。dynamic mock就是自动帮程序员产生一个实现了接口的对象,只是不能完全取代手工mock,比如更新到数据库的代码不是你写的,你要测试依赖更新到数据库的接口的时候就可以用动态mokc机制。
      

  17.   

    动态mokc就是程序员偷懒的一种手段。
      

  18.   

    学习中... 欢迎加入ASP.NET(C#)学习交流QQ群号:32801051
      

  19.   

    估计没有人回答了,估计应该按照flyforlove(为情飞)提供的思路,等到明天,就友情散分。
    现在我发发功,召唤思飞大仙,看看能不能召唤那个夜猫子神来回答。
      

  20.   

    反序列化和反射是将具有匹配schema的stream组装成对象,但是应该是不可能给对象加上一个schema中没有的接口…… 不知道动态修改运行时的IL文件或者修改序列化后的schema然后反射出对象能不能实现。我也不知道怎么做
      

  21.   

    我们做单元测试都是自己写mock类……汗……
      

  22.   

    好像JAVA中,可以通过框架实现动态代码生成。所以在.Net中应该也是可以的,只是没有这样做过……
      

  23.   

    用CodeDom在运行时生成Class BBB (或者他的一个子类),并且实现IAAA接口:using System.Reflection;
    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