接收动态变化的类

时间:2012-11-30 08:48:34

标签: c# object dynamic singleton

在我的系统中,我有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可以吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

是。你想要的是战略/工厂模式。我将它们命名为可以与您的案例结合使用。这些设计模式有很多例子here,以下是Strategy patternFactory pattern的详细介绍。前两个链接的前者还向您展示了如何将两者结合起来以完全满足您的要求。

因此,在您的情况下,您可以设置以下界面

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.
    }
}

然后你会有一个'工厂'类,它会在运行时强制你。

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"));

获取所需类的统计信息。

我希望这会有所帮助。