在我的系统有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?
你可以使用反射...
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();
}
是。 你想在这里什么是战略/工厂模式。 我的名字都因为他们可以一起使用您的情况。 有这些设计模式的很好的例子, 在这里和以下是详细的前奏策略模式和工厂模式 。 最后两个环节,前者还展示了如何将二者结合起来,做你需要准确啥子。
所以你的情况,你可以设置如下界面
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"));
以获取所需的类的统计信息。
我希望这有帮助。