c#从基类到扩展类(System.Reflection.Assembly)的隐式强制转换

本文关键字:转换 Assembly Reflection 基类 扩展 System | 更新日期: 2023-09-27 18:15:42

我一直在工作的项目提到c-sharp- compilerresultgenerateinmemory。

我已经写了很多代码来实现我的"类发现"。它工作得很酷,但我意识到如果我把所有东西都实现为"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# ?
这似乎表明我的选角应该是有效的,除非我误解了答案。

c#从基类到扩展类(System.Reflection.Assembly)的隐式强制转换

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

考虑以下:

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();

您可能想在这里实现一些不同的东西,这可以通过使用extensionmethods

来实现

你必须创建一个静态类,然后提供像这样扩展对象的功能:

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

你可以这样调用它:

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