2011-04-21 70 views
4

我对C#世界相当陌生,如果问题标题与内容不完全匹配,我表示歉意。但现在我的问题:调用方法匿名类

我有以下结构:

public interface IClass<TEnum> 
    { 
     Dictionary<TEnum, ISecondClass> dictionary { get; } 
    } 

    public abstract class ClassBase<TEnum> : IClass<TEnum> 
    { 
    public abstract Dictionary<TEnum, ISecondClass> dictionary { get; protected set; } 
    } 

    public class ConcreteClass : ClassBase<ConcreteClass.Concrete> 
    { 
     public override Dictionary<Concrete, ISecondClass> dictionary { get; protected set; } 

     public enum Concrete : ulong 
     { 

     } 
    } 

    public class OtherClass : ClassBase<OtherClass.Other> 
    { 
     public override Dictionary<Concrete, ISecondClass> dictionary { get; protected set; } 

     public enum Other : ulong 
     { 

     } 
    } 

我的目标是实例基于它的枚举所有现有的具体类,所有实例存储在一个字典,后来调用每个一些方法目的。 我不确定这是否可能?

我很高兴有任何提示!

+0

你说你想要的字典在全球范围内跟踪类的每个实例的? – 2011-04-21 15:15:44

+1

这里有很多选项。如果你向我们展示了你想要“调用某些方法”的代码看起来像 – 2011-04-21 15:16:36

+0

顺便说一句,我注意到其他类中的字典是Dictionary '。它应该是'Dictionary '? – 2011-04-21 15:26:31

回答

3

如果我明白你想要做什么,听起来像是Multiton Pattern的一个版本。你可能会发现研究它很有用。

维基百科的例子多例代码:

class FooMultiton 
{ 
    private static readonly Dictionary<object, FooMultiton> _instances = new Dictionary<object, FooMultiton>(); 

    private FooMultiton() {} 

    public static FooMultiton GetInstance(object key) 
    { 
     lock (_instances) 
     { 
      FooMultiton instance; 
      if (!_instances.TryGetValue(key, out instance)) 
      { 
       instance = new FooMultiton(); 
       _instances.Add(key, instance); 
      } 
     } 
     return instance; 
    } 
} 

这不是直接pasteable到类,但因为你正在寻找线索,我认为它应该指向你在正确的方向。

关于上述代码需要注意的一个字:如果未找到key,则方法GetInstance将更改字典。就我个人而言,我将“Get”前缀与只读方法相关联。我会重命名GetInstance或将其分为两种方法。不过,我不太清楚你的意思是“基于它的枚举实例化所有现有的具体类”。你能澄清一下吗?

+0

感谢您的快速回复,但那不完全是我的问题。我想我需要发布更多的代码来描述我的问题的所有方面。 – sra 2011-04-21 19:52:26

+0

我的问题和标题不是很好选择,所以你的答案是最接近我正在寻找的。当我想出如何自己调用这些方法的时候。 – sra 2011-04-27 05:53:32

1

使用Activator.CreateInstance()来创建具体类的对象并将它们存储到字典中。

传递您的string classname from Enum并创建动态类对象。它们存储到Dictionary<Enum, ISecondClass>

myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName"); 

or 

var type = Type.GetType("MyFullyQualifiedTypeName"); 
var myObject = (MyAbstractClass)Activator.CreateInstance(type); 

虽然检索,根据您的枚举密钥,你知道代表什么类型的实例值。

+0

是的,那是我的想法。但我想使用一个循环来处理所有的,然后我不能输入具体的baseclass因为所有实现另一个枚举,基于具体的类。我会尝试重新发布一些代码,我发现我发布的内容并未显示我的问题的所有方面。但是当我不在我的智能手机上时,我需要这样做。我想明天。 – sra 2011-04-21 19:50:04

0

我不明白,示例代码的目标,但你可以写一些这样的事:

public interface IClass 
{ 
    void MethodToDynamicInvoke(); 
} 

public abstract class ClassBase<T> 
    : IClass 
{ 
    private Dictionary<Type, List<IClass>> instances = new Dictionary<Type, List<IClass>>(); 

    public ClassBase() 
    { 
     List<IClass> list; 
     if (!instances.TryGetValue(typeof(T), out list)) 
     { 
      list = new List<IClass>(); 
      instances.Add(typeof(T), list); 
     } 

     list.Add(this); 
    } 

    public abstract void MethodToDynamicInvoke(); 

    public void InvokeMetodOnClassesWithSameEnum() 
    { 
     List<IClass> list; 
     if (instances.TryGetValue(EnumType, out list)) 
     { 
      foreach (var instance in list) 
      { 
       instance.MethodToDynamicInvoke(); 
      } 
     } 
    } 
} 

public class ConcreteClass 
    : ClassBase<ConcreteClass.Concrete> 
{ 
    public ConcreteClass() 
     : base() 
    { 
    } 

    public override void MethodToDynamicInvoke() 
    { 
     throw new NotImplementedException(); 
    } 

    public enum Concrete : ulong 
    { 
    } 
} 

public class OtherClass : ClassBase<OtherClass.Other> 
{ 
    public OtherClass() 
     : base() 
    { 
    } 

    public override void MethodToDynamicInvoke() 
    { 
     throw new NotImplementedException(); 
    } 

    public enum Other : ulong 
    { 

    } 
} 
+0

感谢您的回复,但我认为这并没有帮助我... – sra 2011-04-21 19:55:59