如何从字符串中实例化类型及其值?

时间:2009-03-14 12:15:13

标签: c# .net

我的代码类似于:

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时,从字符串中解析类型值。

5 个答案:

答案 0 :(得分:9)

请注意,如果类型不在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)

  

a)如何实例化类型

您正在寻找System.Activator.CreateInstance

  

b)支持Parse时,从字符串中解析类型值。

您正在寻找System.Convert.ChangeType

答案 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)

还有一件事:在字典中保留对新实例的引用可能会产生意想不到的后果:字典对该对象的引用将使其不被收集。如果那是你想要的,那就没关系,但只是要确定你的第一个含义。