C# 在运行时实例化未知类型的自定义类

C# 在运行时实例化未知类型的自定义类,c#,.net,C#,.net,我以前见过这个问题的变体,但还没有找到答案 我有一个自定义类: public class Indicator { public double Value { get; set;} virtual public void Calc(val1, val2) {} } 我有许多从中派生的类,例如: class calc_sum : Indicator { override public void Calc(val1, val2) { Value=val1+

我以前见过这个问题的变体,但还没有找到答案

我有一个自定义类:

public class Indicator
{
   public double Value { get; set;}

   virtual public void Calc(val1, val2) {}
}
我有许多从中派生的类,例如:

class calc_sum : Indicator
{    
   override public void Calc(val1, val2)
   {
     Value=val1+val2;
   }
}
最后,我有一个类来保存所有“指标”:

这样,用户可以在运行时添加指示器(IndicatorsCollection绑定到一个列表,该列表显示每个成员的Value属性)

我希望我说得够清楚,并且我采取了正确的方法。 谢谢大家

更新: Activator方法正是我想要的,因此我将尝试使其更加困难:

添加指示器实例后,IndicatorCollection可以公开一个新属性,该属性是类的Value属性的快捷方式

i、 e:


可以使用activator类根据类名实例化对象。假设bin目录(或其他探测路径)中的程序集中存在
calc\u sum
指示器,则可以获取该指示器的实例:

var myIndicator = Activator.CreateInstance(Type.GetType("calc_sum")) as Indicator;

可以使用activator类根据类名实例化对象。假设bin目录(或其他探测路径)中的程序集中存在
calc\u sum
指示器,则可以获取该指示器的实例:

var myIndicator = Activator.CreateInstance(Type.GetType("calc_sum")) as Indicator;

如果
指示器
类及其子类公开了公共无参数构造函数,则可以使用在运行时从类的名称动态实例化类:

public class IndicatorCollection
{
    public void AddIndicator(string className)
    {
        _collection.Add((Indicator)
            Activator.CreateInstance(null, className).Unwrap());
    }

    private List<Indicator> _collection = new List<Indicator>();
}
公共类指示符集合
{
public void AddIndicator(字符串类名称)
{
_集合。添加((指示符)
Activator.CreateInstance(null,className).Unwrap());
}
私有列表_collection=新列表();
}

如果
指示符
类及其子类公开了一个公共的无参数构造函数,则可以使用在运行时从类的名称动态实例化类:

public class IndicatorCollection
{
    public void AddIndicator(string className)
    {
        _collection.Add((Indicator)
            Activator.CreateInstance(null, className).Unwrap());
    }

    private List<Indicator> _collection = new List<Indicator>();
}
公共类指示符集合
{
public void AddIndicator(字符串类名称)
{
_集合。添加((指示符)
Activator.CreateInstance(null,className).Unwrap());
}
私有列表_collection=新列表();
}

关于第二个要求(更新后),为什么不使用
字典而不是
列表来存储名称?也许你的要求过于复杂了

public class IndicatorCollection
{
    var _dictionary = new Dictrionary<string, Indicator>();

    public void AddIndicator(string className)
    {
        _dictionary.Add(
            className,
            (Indicator)Activator.CreateInstance(null, className).Unwrap()
        );
    }
}

关于第二个要求(更新后),为什么不使用
字典
而不是
列表
来存储名称?也许你的要求过于复杂了

public class IndicatorCollection
{
    var _dictionary = new Dictrionary<string, Indicator>();

    public void AddIndicator(string className)
    {
        _dictionary.Add(
            className,
            (Indicator)Activator.CreateInstance(null, className).Unwrap()
        );
    }
}

由于
覆盖
虚拟
关键字不能排在修改器列表的第一位,您的代码将无法编译。我还将根据上面的示例制作
指示器
计算
方法摘要。我认为您的新要求无法满足。无法使用C#动态地向现有类型添加属性。您的代码将无法编译,因为
覆盖
虚拟
关键字不能位于修改器列表的第一位。我还将根据上面的示例制作
指示符
计算
方法摘要。我认为您的新要求无法满足得到满足。无法使用C#动态向现有类型添加属性。我希望它成为属性的原因是:当前列表绑定到ItemsCollection。我希望将它绑定到单个项,即:{Binding IndicatorCollectionInstance.calc_sum}我希望它成为属性的原因是:当前列表绑定到ItemsCollection。我想将其绑定到单个项,即:{Binding IndicatorCollectionInstance.calc_sum}
public double GetValue(string indicatorName)
{
   return _dictionary[indicatorName].Value;
}