C# 调用匿名类的方法
我对C#world很陌生,如果问题标题与内容不完全匹配,我深表歉意。但现在我的问题是: 我有以下结构:C# 调用匿名类的方法,c#,generics,C#,Generics,我对C#world很陌生,如果问题标题与内容不完全匹配,我深表歉意。但现在我的问题是: 我有以下结构: public interface IClass<TEnum> { Dictionary<TEnum, ISecondClass> dictionary { get; } } public abstract class ClassBase<TEnum> : IClass<TEnum> {
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
{
}
}
公共接口类
{
字典{get;}
}
公共抽象类类库:IClass
{
公共抽象词典{get;protected set;}
}
公共类:ClassBase
{
公共重写字典{get;protected set;}
公用混凝土:乌龙
{
}
}
公共类OtherClass:ClassBase
{
公共重写字典{get;protected set;}
公共枚举其他: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;
}
}
class-footon
{
私有静态只读字典_实例=新字典();
私有foomulton(){}
公共静态FoomMultiton GetInstance(对象键)
{
锁定(_个实例)
{
Footon实例;
if(!\u instances.TryGetValue(key,out实例))
{
实例=新的foomulton();
_实例。添加(键,实例);
}
}
返回实例;
}
}
这不能直接粘贴到类中,但由于您正在寻找提示,我认为它应该为您指明正确的方向
关于上述代码,有一点需要注意:如果未找到键,则方法GetInstance
将更改字典。就我个人而言,我将“Get”前缀与只读方法相关联。我要么重命名GetInstance
,要么将其拆分为两个方法
不过,我不太清楚“基于枚举实例化所有现有的具体类”是什么意思。您能澄清一下吗?使用Activator.CreateInstance()
创建具体类的对象并将它们存储到字典中
从Enum中传递字符串类名称并创建动态类对象。将它们存储到字典中
根据枚举键进行检索时,您知道实例值的类型 我不理解示例代码的目标,但您可以编写如下内容:
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
{
}
}
公共接口类
{
void MethodToDynamicInvoke();
}
公共抽象类类库
:i类
{
私有字典实例=新字典();
公共类库()
{
名单;
if(!instances.TryGetValue(typeof(T),out list))
{
列表=新列表();
实例。添加(类型(T),列表);
}
列表。添加(此);
}
公共抽象void MethodToDynamicInvoke();
public void InvokeMetodOnClassesWithSameEnum()
{
名单;
if(instances.TryGetValue(枚举类型,输出列表))
{
foreach(列表中的var实例)
{
MethodToDynamicInvoke();
}
}
}
}
公共课
:ClassBase
{
公共课()
:base()
{
}
公共重写void MethodToDynamicInvoke()
{
抛出新的NotImplementedException();
}
公用混凝土:乌龙
{
}
}
公共类OtherClass:ClassBase
{
公共类()
:base()
{
}
公共重写void MethodToDynamicInvoke()
{
抛出新的NotImplementedException();
}
公共枚举其他:ulong
{
}
}
您是说希望字典全局跟踪类的每个实例吗?这里有很多选项。如果您向我们展示了您希望“调用某些方法”的代码看起来像什么,这可能会有所帮助。我注意到其他类中的字典是Dictionary
。是不是应该是字典?@justin是的,你是对的。我会纠正这一点@康拉德:好的,我一回到我的笔记本电脑上就会做这件事。我当时在用智能手机,我就是这么想的。但是我想使用一个循环来处理所有的,然后我不能键入具体的基类,因为所有的基类都实现了另一个枚举,基于具体的类。我将尝试重新发布一些代码,我发现我发布的内容并没有显示问题的所有方面。但当我不在智能手机上时,我需要这样做。我想明天吧。谢谢你的快速回复,但这不完全是我的问题。我想我需要发布更多的代码来描述我问题的各个方面。我的问题和标题选择得不太好,所以你的答案与我想要的最接近。当我知道如何自己调用这些方法时。
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
{
}
}