0

我一直在处理提到的项目c-sharp-compilerresults-generateinmemory

我一直在编写大量代码来实现我的“类发现”。它很酷,但我意识到如果我将所有东西都实现为“System.Reflection.Assembly”的派生类,效率会高得多。

因此,在编写了新的派生类后,我遇到了一个问题。当我尝试将基类分配给新的派生类时,它会抛出一个错误,只是正常的did you miss an explicit cast错误。

我认为 C# 对扩展类型进行了隐式转换?

所以我有一些这样的源代码......

Assembly asm = MyCompilerResults.CompiledAssembly(); /* this works */
Interface asmInterface = new Interface();
asmInterface = asm; /* bad */
asmInterface = (Interface)asm; /* bad */


public class Interface : Assembly {
    public Interface() {} // I always just declare the empty constructor.

    public void Helpermethod1() {}
    public void Helpermethod2() {}
    public void Helpermethod3() {}
};

所以因为这只是我写 C# 的第二周,所以我不得不问......
我如何将基类添加到我的类中?

这里的问题... 为什么我不能在 C# 中将隐式运算符从基类写入派生类?
这似乎表明我的选角应该有效,除非我误解了答案。

4

2 回答 2

1

您可能想在这里实现一些不同的东西,这可以通过使用扩展方法来完成

您必须创建一个静态类,然后提供扩展对象的功能,如下所示:

public static class AssemblyExtension
{

    public static void HelperMethod1(this Assembly asm)
    {
        Console.WriteLine(asm.ToString());
    }
}

然后你可以这样称呼它:

Assembly asm = MyCompilerResults.CompiledAssembly(); 
asm.HelperMethod1();
于 2014-07-29T17:26:45.970 回答
1

我想你误会了什么。您要实现的是将基类分配给派生类。几乎在所有情况下都不可能。

考虑以下:

public class A 
{
}

public class B : A
{
}

A a = new B();

// some code

B b = (B)a; // it is possible. Behind the scenes, variable a is of B type.

但:

A a = new A();
B b = (B)a; //IT'S NOT ALLOWED. The variable a is of type A that has 
            // no "knowledge" about B class.

在您的情况下,CompiledAssembly()返回的Assembly实例没有任何关于Interface类的信息,因此不能直接转换。

有两种选择。写包装:

public class Interface 
{
     private readonly Assembly underlyingAssembly;
     publiic Interface(Assembly asm)
     {
        this.underlyingAssembly = asm;
     }

     // other methods
}

Assembly someAsm = MyCompilerResults.CompiledAssembly();
Interface interface = new Interface(someAsm);

或编写扩展方法:

public static class AsmExt
{
     public static void SomeMethod(this Assembly asm)
     {
     }
}

Assembly someAsm = MyCompilerResults.CompiledAssembly();
someAsm.SomeMethod();
于 2014-07-29T17:27:15.797 回答