按字符串名称获取抽象类

时间:2012-10-16 12:21:57

标签: c# asp.net

我有两个班级:

  class Car<T>
{
    public string color { get; set; }
    public virtual T features { get; set; }
    public virtual void TestDrive();
}
class Toyota : Car<ToyotaFeatures>
{
    public override ToyotaFeatures features { get; set; }
    public override void TestDrive()
    {
        //Logic here...
    }
}

现在我有一个完整的字符串类名:“MySol.MyProj.Toyota”
我想通过我的字符串名称实例化一个类,然后运行TestDrive() 问题在于,当我尝试运行Activator.CreateInstance(null, "MySol.MyProj.Toyota");时 我无法将其转换为基类并运行testDrive,因为它期望将ToyotaFeatures类传递给它。但我只想运行只有字符串类名的TestDrive()。

而且我不想将其转换为特定类型。只有基类型才能根据提供的字符串决定运行哪个TestDrive()。

4 个答案:

答案 0 :(得分:3)

为此目的,接口非常好。

interface ITestDrivable
{
    void TestDrive();
}

您的抽象类实现了接口:

class Car<T> : ITestDrivable
{
    public string Color { get; set; }
    public virtual T Features { get; set; }
    public abstract void TestDrive() { }
}

铸造变得非常简单:

ITestDrivable car = (ITestDrivable)Activator.CreateInstance(null, "MySol.MyProj.Toyota");
car.TestDrive();

答案 1 :(得分:3)

Type type = Type.GetType("MySol.MyProj.Toyota");

var obj = Activator.CreateInstance(type);
type.GetMethod("TestDrive").Invoke(obj, null);

答案 2 :(得分:0)

这是否有意义:

abstract class CarFeatures { }

class ToyotaFeatures : CarFeatures { }

abstract class Car
{
    public string color { get; set; }
    public virtual void TestDrive() { }
}

abstract class Car<T> : Car where T : CarFeatures
{
    public virtual T features { get; set; }

    public Car(T _features)
    {
        features = _features;
    }
}

class Toyota : Car<ToyotaFeatures>
{
    public override ToyotaFeatures features { get; set; }

    public Toyota(ToyotaFeatures _features) : base(_features) { }

    public override void TestDrive()
    {
        //Logic here...
    }
}

我不止一次地从非泛型类中派生了我的泛型类,将所有常用的方法和字段放在非泛型依赖项中,让我可以轻松访问它们。

ToyotaFeatures features = new ToyotaFeatures();
Car car = (Car)Activator.CreateInstance(typeof(Toyota), new object[] { features });
car.TestDrive();

但是,如果有人有更好的解决方案,我也会受到关注。

编辑:如上所述,界面很酷,但我的经验法则是“如果你只使用一个类,不要创建一个界面”。但它确实有效。

重新编辑:问题是使用一系列参数来实现通用对象。

答案 3 :(得分:0)

您应该在类中实现接口IConvertible,然后使用方法Convert.ChangeType(..)。代码示例可以是:

   // hords the created object
   object createdByActivator = ....;
   Car objectAsCar = Convert.ChangeType(createdByActivator, Type.GetType("MySol.MyProj.Toyota"