创建一个名称保存在字符串

时间:2016-04-15 19:12:05

标签: c# class reflection

我正在寻找一种方法来初始化一个以字符串作为名称的类的新实例,以便我稍后在列表中找到该特定实例。

目前,我有一些与此代码类似的内容:

static List<ClassItem> classList = new List<ClassItem>();

private void updateClassList(Stream stream)
{
    Message = Recieve(stream);
    Interact(Message); //get the number of Classes about to be recieved

    string ID;
    string state;

    for(int i = 0; i < numberOfClasses; i++)
    {
        Message = Recieve(stream);
        interpretClassProperties(Message, out ID, out State);

        ClassItem ID = new ClassItem(ID, state); //incorrect code
        classList.Add(ID); //add new instance to list
    }
}

显然这不会起作用,因为我无法使用变量初始化类实例,但逻辑上它显示了我想要实现的内容。每个循环都会将ClassItem的实例(带有适当的ID值作为名称)添加到classList,以便稍后查找。

为了达到这个目的,我应该考虑什么?

任何反馈意见,包括我可能以这种方式解决问题的未来问题的任何警告。 (即,按名称在List中查找类实例)。

2 个答案:

答案 0 :(得分:0)

使用Activator.CreateInstance:

public static ObjectHandle CreateInstance(
    string assemblyName,
    string typeName
)

您知道您的程序集名称并接收类名(类型名称)。

MSDN:https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx

示例代码:

static List<object> classList = new List<object>();

private void updateClassList(Stream stream)

    {
        Message = Recieve(stream);
        Interact(Message); //get the number of Classes about to be recieved

        string id;

        for(int i = 0; i < numberOfClasses; i++)
        {
            Message = Recieve(stream);
            interpretClassProperties(Message, out id);

            classList.Add(Activator.CreateInstance("AssemblyName", id).Unwrap());
        }
    }

答案 1 :(得分:0)

这是你想要的东西吗?但要注意,除非您确定从静态列表中取消引用您的实例,否则这可能会造成内存噩梦。

public class ClassWithIds
{
    public static List<ClassWithIds> Instances = new List<ClassWithIds>();

    private static int _idSeed = 0;

    private readonly string _name;

    public string Name
    {
        get
        {
            return _name;
        }
    }

    private static int NextId()
    {
        return Interlocked.Increment(ref _idSeed);
    }

    public ClassWithIds()
    {
        _name = this.GetType().FullName + " Number " + NextId();
        Instances.Add(this);
    }
}