标题可能没有说明我到底要做什么。 我不确定这是否可行,但也许有一种解决方法。 下面的代码只是为了展示我想要实现的目标,我知道这是错误的。是否可以在运行时创建基类或继承类?或者以其他方式实现目标?我希望你能从代码中获得主要想法。如果没有,我会尝试解释更多。
public class BaseClass {
public int baseNumber {get; set;};
}
public class DerivecClass : BaseClass {
public int derivedNumber {get; set;};
}
public BaseClass Foo(bool derived) {
var classInstance;
if (derived) {
classInstance = new DerivedClass();
} else {
classInstance = new BaseClass();
}
classInstance.baseNumber = 1234;
if (derived) {
classInstance.derivedNumber = 4321;
}
return classInstance;
}
答案 0 :(得分:1)
你不能"""运行时的类(并且隐式地将所有类子类化为另一个类或System.Object
(这是另一个类:-))
您可以通过System.Reflection.Emit
命名空间在运行时创建新的动态类。您需要使用TypeBuilder类。这个新类几乎可以子类化任何没有密封的类,并且没有private
/ internal
构造函数(有一些特殊的例外)
如果您想要一个简单的工厂模式,那么这很容易:
public class BaseClass
{
public int baseNumber { get; set; }
// So that BaseClass can't be created by other code through
// the new BaseClass()
protected BaseClass()
{
}
public static BaseClass Create(bool derived)
{
BaseClass classInstance;
if (derived)
{
classInstance = new DerivedClass();
}
else
{
classInstance = new BaseClass();
}
classInstance.baseNumber = 1234;
if (derived)
{
((DerivedClass)classInstance).derivedNumber = 4321;
}
return classInstance;
}
}
public class DerivedClass : BaseClass
{
public int derivedNumber { get; set; }
// So that DerivedClass can't be created by other code through
// the new DerivedClass()
protected DerivedClass()
{
}
}
使用这种模式,几乎完全按照书面形式
答案 1 :(得分:0)
只是要添加到我的工厂模式评论中,您将拥有以下内容:
类:
public abstract class BaseClass
{
public int BaseNumber {get; set;}
}
public class DerivedClassA : BaseClass
{
public DerivedClassA()
{
BaseNumber = 1234;
}
}
public class DerivedClassB : BaseClass
{
public DerivedClassB()
{
BaseNumber = 4321;
}
}
厂:
public class ClassFactory
{
// I'd use an Enum parameter rather than a string, but you get the idea
public static BaseClass GetClass(string classType)
{
if classType.Equals("A")
return new DerivedClassA();
else
return new DerivedClassB();
}
}
致电代码:
BaseClass class = ClassFactory.GetClass("A");