我正在寻找一种方法来初始化一个以字符串作为名称的类的新实例,以便我稍后在列表中找到该特定实例。
目前,我有一些与此代码类似的内容:
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中查找类实例)。
答案 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);
}
}