Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用匿名类的方法_C#_Generics - Fatal编程技术网

C# 调用匿名类的方法

C# 调用匿名类的方法,c#,generics,C#,Generics,我对C#world很陌生,如果问题标题与内容不完全匹配,我深表歉意。但现在我的问题是: 我有以下结构: public interface IClass<TEnum> { Dictionary<TEnum, ISecondClass> dictionary { get; } } public abstract class ClassBase<TEnum> : IClass<TEnum> {

我对C#world很陌生,如果问题标题与内容不完全匹配,我深表歉意。但现在我的问题是:

我有以下结构:

    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
    {

    }
}