接收动态变化的类(Receiving dynamically changing classes)

2019-10-17 11:13发布

在我的系统有16个不同类别都用于统计。 他们看起来像以下

public class myClass : myInheritage
{
    private static myClass _instance;

    public static myClass  Instance
    {
        get { return _instance ?? (_instance = new myClass(); }
    }

    public static void Reset()
    {
        _instance = null;
    }
}

它们都制作成单身

myInheritage看起来是这样的:

public class myInheritage
{
    int data = 0;

    public myInheritage()
    {
    }

    public int Data
    {
        get { return data; }
        set { data+= value; }
    }
}

该计划是由,因此,用户选择他想使与统计的类。

像这样的东西就是我想要的

    public void statistics(Object myObject, string name)
    {
        Object x = myObject;

        x.Data = 10;

        x.Data();
    }

从另一个类调用

    statistics(myClass.Instance, "myClass");
    statistics(myClass2.Instance, "myClass2)";

所以我要动态地改变我的实例中我的统计类。

这是可能的使用.NET 2.0?

Answer 1:

你可以使用反射...

MethodInfo method = myObject.GetType().GetMethod("Reset");
if (method != null) method.Invoke(myObject, null);

如果你可以修改类本身,一个更好的方法是让每个实现一个接口(或基类) IResettable

public interface IResettable
{
    void Reset();
}

public class myClass : myInheritage, IResettable
{
    public void Reset() { ... }
}

然后,你可以编写针对接口功能:

public void statistics(IResettable myObject, string name)
{
    myObject.Reset();
}


Answer 2:

是。 你想在这里什么是战略/工厂模式。 我的名字都因为他们可以一起使用您的情况。 有这些设计模式的很好的例子, 在这里和以下是详细的前奏策略模式和工厂模式 。 最后两个环节,前者还展示了如何将二者结合起来,做你需要准确啥子。

所以你的情况,你可以设置如下界面

public interface IStatistics
{
    // Some method used by all classes to impose statistics.
    void ImposeStatistics();
}

然后,在你单身类你可以有

public class myClass : myInheritage, IStatistics
{
    private static myClass _instance;

    public static myClass  Instance
    {
        get { return _instance ?? (_instance = new myClass()); }
    }

    public static void Reset()
    {
        _instance = null;
    }

    // You would also inherit from IStatistics in your other classes.
    public void ImposeStatistics()
    {
        // Do stuff.
    }
}

然后,你将有一个“工厂”类强加你stratgey在运行时。

public static class StatisticFactory 
{
    public static void ImposeStatistics(IStatistics statsType)
    {
        statsType.ImposeStatistics();
    }

    /// <summary>
    /// Get the conversion type.
    /// </summary>
    /// <param name="col">The column to perform the conversion upon.</param>
    public static IStatistics GetStatsType(string typeName)
    {
        switch (typeName)
        {
            case "BoseEinstein":
                return new BoseEinsteinStats();
            case "FermiDirac":
                return new FermiDiracStats();
            default:
                return null;
        }
    }
}

然后,您可以调用这个样

// Run stats.
IStatistics stats = StatisticFactory(GetStatsType("BoseEinstein"));

以获取所需的类的统计信息。

我希望这有帮助。



文章来源: Receiving dynamically changing classes