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# ?
这似乎表明我的选角应该是有效的,除非我误解了答案。
我想你误解了什么。您要实现的是将基类分配给派生类。在几乎所有情况下,这是不可能的。
考虑以下:
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();