动态创建基类或继承的类

时间:2015-05-11 14:08:06

标签: c#

标题可能没有说明我到底要做什么。 我不确定这是否可行,但也许有一种解决方法。 下面的代码只是为了展示我想要实现的目标,我知道这是错误的。是否可以在运行时创建基类或继承类?或者以其他方式实现目标?我希望你能从代码中获得主要想法。如果没有,我会尝试解释更多。

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;
}

2 个答案:

答案 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()
    {
    }
}

XmlReader.Create(String, XmlReaderSettings)

使用这种模式,几乎完全按照书面形式

答案 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");