我一直在处理提到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#?
这似乎表明我的演员应该有效,除非我误解了答案。
答案 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();