C#从基类隐式转换为扩展(System.Reflection.Assembly)

时间:2014-07-29 17:14:06

标签: c# .net-assembly upcasting

我一直在处理提到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#,我不得不问...... 如何将基类添加到我的班级?

这里的问题...... Why can't I write an implicit operator from a Base class to a Derived class in C#?
这似乎表明我的演员应该有效,除非我误解了答案。

2 个答案:

答案 0 :(得分:1)

您可能希望在此处获得不同的内容,可以使用extensionmethods

来完成

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

public static class AssemblyExtension
{

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

然后你可以这样称呼它:

Assembly asm = MyCompilerResults.CompiledAssembly(); 
asm.HelperMethod1();

答案 1 :(得分: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();