首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按字符串名称获取抽象类

按字符串名称获取抽象类
EN

Stack Overflow用户
提问于 2012-10-16 20:21:57
回答 4查看 366关注 0票数 2

我有两个类:

代码语言:javascript
复制
  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()。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-16 20:29:26

为了达到这个目的,接口是非常好的。

代码语言:javascript
复制
interface ITestDrivable
{
    void TestDrive();
}

您的抽象类实现了以下接口:

代码语言:javascript
复制
class Car<T> : ITestDrivable
{
    public string Color { get; set; }
    public virtual T Features { get; set; }
    public abstract void TestDrive() { }
}

选角非常简单:

代码语言:javascript
复制
ITestDrivable car = (ITestDrivable)Activator.CreateInstance(null, "MySol.MyProj.Toyota");
car.TestDrive();
票数 3
EN

Stack Overflow用户

发布于 2012-10-16 20:33:46

代码语言:javascript
复制
Type type = Type.GetType("MySol.MyProj.Toyota");

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

Stack Overflow用户

发布于 2012-10-16 20:34:49

这有什么意义吗:

代码语言:javascript
复制
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...
    }
}

不止一次,我从一个非泛型类派生了我的泛型类,以放置所有不依赖泛型的通用方法和字段,这使我可以轻松地访问它们。

代码语言:javascript
复制
ToyotaFeatures features = new ToyotaFeatures();
Car car = (Car)Activator.CreateInstance(typeof(Toyota), new object[] { features });
car.TestDrive();

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12914613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档