我的代码类似于:
class Foo {
Dictionary<Type, Object> _dict;
void Create(string myType, string myValue)
{
var instance = Type.Instanciate(myType) // How do I do this?
if (var.IsPrimitive)
{
var.GetType().Parse(myValue) // I know this is there...how to invoke?
Dictionary[instance.GetType()] = instance;
}
}
T GetValue<T>(T myType) { return (T)_dict[T]; }
}
// Populate with values
foo.Create("System.Int32", "15");
foo.Create("System.String", "My String");
foo.Create("System.Boolean", "False");
// Access a value
bool b = GetValue(b);
所以我的问题是:
a)如何实例化类型
b)当支持Parse时,从字符串中解析类型值。
答案 0 :(得分:9)
Type.GetType()
Activator.CreateInstance
(您的代码中实际上并不需要这样。)Convert.ChangeType
请注意,如果类型不在mscorlib
或当前正在执行的程序集中,则需要包含程序集名称(如果名称强烈,则需要包含版本信息)。
这是使用原始代码的完整示例。请注意GetValue
不需要普通参数,因为您已经给出了类型参数(T)。
using System;
using System.Collections.Generic;
public class Foo {
Dictionary<Type, Object> _dict = new Dictionary<Type, Object>();
public void Create(string myType, string myValue)
{
Type type = Type.GetType(myType);
object value = Convert.ChangeType(myValue, type);
_dict[type] = value;
}
public T GetValue<T>() { return (T)_dict[typeof(T)]; }
}
class Test
{
static void Main()
{
Foo foo = new Foo();
// Populate with values
foo.Create("System.Int32", "15");
foo.Create("System.String", "My String");
foo.Create("System.Boolean", "False");
Console.WriteLine(foo.GetValue<int>());
Console.WriteLine(foo.GetValue<string>());
Console.WriteLine(foo.GetValue<bool>());
}
}
答案 1 :(得分:1)
答案 2 :(得分:1)
using System.Reflection;
public void Create(string myType, string myValue)
{
Type type = Type.GetType(myType);
if (type.IsPrimitive)
{
MethodInfo Parse = type.GetMethod("Parse");
Parse.Invoke(null, new object[] { myValue });
...
}
}
答案 3 :(得分:0)
您可以尝试使用Activator.CreateInstance
它有签名接收一个类型,没有参数,或者有一个ojects数组,虽然是参数
答案 4 :(得分:0)
还有一件事:在字典中保留对新实例的引用可能会产生意想不到的后果:字典对该对象的引用将使其不被收集。如果那是你想要的,那就没关系,但只是要确定你的第一个含义。