1

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

4

2 回答 2

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();
}
于 2012-11-30T08:54:04.827 回答
1

是的。你在这里想要的是一个策略/工厂模式。我命名两者,因为它们可以与您的案例结合使用。这里有这些设计模式的很好的例子,下面是对策略模式工厂模式的详细介绍。最后两个链接中的前一个还向您展示了如何将两者结合起来以完全满足您的要求。

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

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

获取所需类的统计信息。

我希望这有帮助。

于 2012-11-30T08:55:13.657 回答