我有两个班级:
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()。
答案 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"
)