我有两个类:
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()。
我不想将它转换为特定的类型。仅限于基类型,以便它可以根据提供的字符串决定运行哪个TestDrive()。
发布于 2012-10-16 20:29:26
为了达到这个目的,接口是非常好的。
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-16 20:33:46
Type type = Type.GetType("MySol.MyProj.Toyota");
var obj = Activator.CreateInstance(type);
type.GetMethod("TestDrive").Invoke(obj, null);发布于 2012-10-16 20:34:49
这有什么意义吗:
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();然而,如果有人有更好的解决方案,我也会感兴趣。
编辑:如上所述,界面很酷,但我的经验法则是“如果你只为一个类使用它,就不要创建一个界面”。但它是有效的。
https://stackoverflow.com/questions/12914613
复制相似问题