Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按字符串名获取抽象类_C#_Asp.net - Fatal编程技术网

C# 按字符串名获取抽象类

C# 按字符串名获取抽象类,c#,asp.net,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;

我有两门课:

  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...
    }
}
等级车
{
公共字符串颜色{get;set;}
公共虚拟T特性{get;set;}
公共虚拟void TestDrive();
}
类别:丰田汽车
{
公共覆盖ToyotaFeatures{get;set;}
公共重写void TestDrive()
{
//逻辑在这里。。。
}
}
现在我有了一个完整的字符串类名:“MySol.MyProj.Toyota”
我想用字符串名实例化一个类,然后运行TestDrive() 问题是,当我尝试运行
Activator.CreateInstance(null,“MySol.MyProj.Toyota”)
我无法将其强制转换为基类并运行testDrive,因为它希望ToyotaFeatures类被传递给它。但是我只想运行只有字符串类名的TestDrive()


我不想把它转换成特定的类型。仅对基类型进行修改,以便它可以根据提供的字符串决定运行哪个TestDrive()。

为此,接口非常好

interface ITestDrivable
{
    void TestDrive();
}
抽象类实现接口:

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

这有什么意义吗:

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...
    }
}
然而,如果有人有更好的解决办法,我也会被问

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


重新编辑:问题是用参数集合实例化泛型对象。

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

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

)

为什么要将实例强制转换为基类?您不想在实例上运行TestDrive方法吗?例如,myInstance.TestDrive()反射很慢,在没有其他方法时应该使用。是否可以通过这种方法将参数传递给构造函数?我必须投球吗class@user194076您可以在对象数组中传递参数(
Activator.CreateInstance(type,new object[]{param1,param2}
)。谢谢。我最终使用了界面和你的激活器参数实现。你代码中的
Car objectAsCar
是他的问题。他不能只写
Car
,它实际上是
Car
,因此是一个泛型类。这看起来很棒。你能解释一下我如何将泛型数据行传递给构造吗或者我可以填充颜色和其他属性?我可以在派生类中这样做吗?问题是,我有一个通用方法,名为:convertToObject(DataRow dr),它返回myType的对象,但我不确定如何在构造函数中使用它。我想的是:this=convertToObject(dr)但这是不允许的。或者我可以在TestDrive(DataRow dr)中执行此操作方法。@user194076首先,你不能做
this=something
的事情。因为
this
是只读关键字。@user194076第二,我不完全明白你想做什么。我不能向Toyota转换,因为我只有一个类的字符串名称。它也可以是Honda。如果你没有只想调用TestDrive?在Toyota中有没有一个特殊的方法你想访问?编辑:啊!我想我知道你要做什么了。你正在创建一个新的对象,并且在初始化时很难填充它的字段。好了。Activator.CreateInstance允许你传递构造函数所需的参数。如果你的基类定义一个构造函数,它需要CarFeatures,您可以在创建对象时设置它们。从这一点开始,您的对象应该正确设置为调用其方法。
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();
   // hords the created object
   object createdByActivator = ....;
   Car objectAsCar = Convert.ChangeType(createdByActivator, Type.GetType("MySol.MyProj.Toyota"