2

我有两节课:

  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

4 回答 4

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

var obj = Activator.CreateInstance(type);
type.GetMethod("TestDrive").Invoke(obj, null);
于 2012-10-16T12:33:45.533 回答
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();
于 2012-10-16T12:29:25.947 回答
0

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

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

)

于 2012-10-16T12:47:00.187 回答
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();

但是,如果有人有更好的解决方案,我也会感兴趣。

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

重新编辑:问题是用一组参数实例化一个通用对象。

于 2012-10-16T12:34:48.727 回答