调用方法匿名类
本文关键字:方法 调用 | 更新日期: 2023-09-27 17:52:16
我是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
{
}
}
我的目标是基于它的枚举实例化所有现有的具体类,将所有实例存储在字典中,然后在每个对象上调用一些方法。我不确定这是否可能?
我很高兴在这方面的任何提示!
如果我理解你想做什么,它听起来像是一个多元素模式的版本。你可能会发现研究一下这个很有用。
来自维基百科的示例Multiton代码:
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;
}
}
这不能直接粘贴到你的类中,但既然你在寻找提示,我认为它应该为你指明正确的方向。
关于上面代码的一个警告:如果没有找到key
,方法GetInstance
将更改字典。个人而言,我将"Get"前缀与只读方法联系起来。我要么重命名GetInstance
,要么将其分成两个方法。
我真的不确定你的意思是"实例化所有现有的具体类基于它的枚举",虽然。你能解释一下吗?
使用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);
在检索时,基于枚举键,您知道实例值代表的类型。
我不明白示例代码的目的,但是您可以这样写:
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
{
}
}