나는 MyClass<T>.
그리고 나는 이것을 가지고 있습니다 string s = "MyClass<AnotherClass>";. 문자열에서 유형을 어떻게 얻을 수 s있습니까?
한 가지 방법 (못생긴)은 “<“및 “>”를 구문 분석하고 다음을 수행하는 것입니다.
Type acType = Type.GetType("AnotherClass");
Type whatIwant = typeof (MyClass<>).MakeGenericType(acType);
그러나 구문 분석 등을 수행하지 않고 최종 유형을 얻는 더 깨끗한 방법이 있습니까?
답변
답변
체크 아웃 Activator.CreateInstance-당신은 유형으로 부를 수 있습니다
Activator.CreateInstance(typeof(MyType))
또는 어셈블리 및 유형 이름을 string
Activator.CreateInstance("myAssembly", "myType")
그러면 필요한 유형의 인스턴스가 제공됩니다.
Type인스턴스 가 아니라 필요한 경우 Type.GetType()메서드와 관심있는 유형의 정규화 된 이름을 사용합니다. 예 :
string s = "System.Text.StringBuilder";
Type myClassType = Type.GetType(s);
그것은 당신에게 Type문제를 줄 것 입니다.
답변
나는 이와 같은 것이 필요했고 필요한 간단한 유형 이름을 구문 분석하기 위해 코드를 작성했습니다. 물론, 같은 제네릭 유형 이름을 식별하지 않기 때문에 개선의 여지가 List<string>있지만 string, int[]등에서 는 괜찮습니다 decimal?. 이것이 누구에게나 도움이 될 경우 공유합니다.
public static class TypeExtensions
{
  public static Type GetTypeFromSimpleName(string typeName)
  {
    if (typeName == null)
      throw new ArgumentNullException("typeName");
    bool isArray = false, isNullable = false;
    if (typeName.IndexOf("[]") != -1)
    {
      isArray = true;
      typeName = typeName.Remove(typeName.IndexOf("[]"), 2);
    }
    if (typeName.IndexOf("?") != -1)
    {
      isNullable = true;
      typeName = typeName.Remove(typeName.IndexOf("?"), 1);
    }
    typeName = typeName.ToLower();
    string parsedTypeName = null;
    switch (typeName)
    {
      case "bool":
      case "boolean":
        parsedTypeName = "System.Boolean";
        break;
      case "byte":
        parsedTypeName = "System.Byte";
        break;
      case "char":
        parsedTypeName = "System.Char";
        break;
      case "datetime":
        parsedTypeName = "System.DateTime";
        break;
      case "datetimeoffset":
        parsedTypeName = "System.DateTimeOffset";
        break;
      case "decimal":
        parsedTypeName = "System.Decimal";
        break;
      case "double":
        parsedTypeName = "System.Double";
        break;
      case "float":
        parsedTypeName = "System.Single";
        break;
      case "int16":
      case "short":
        parsedTypeName = "System.Int16";
        break;
      case "int32":
      case "int":
        parsedTypeName = "System.Int32";
        break;
      case "int64":
      case "long":
        parsedTypeName = "System.Int64";
        break;
      case "object":
        parsedTypeName = "System.Object";
        break;
      case "sbyte":
        parsedTypeName = "System.SByte";
        break;
      case "string":
        parsedTypeName = "System.String";
        break;
      case "timespan":
        parsedTypeName = "System.TimeSpan";
        break;
      case "uint16":
      case "ushort":
        parsedTypeName = "System.UInt16";
        break;
      case "uint32":
      case "uint":
        parsedTypeName = "System.UInt32";
        break;
      case "uint64":
      case "ulong":
        parsedTypeName = "System.UInt64";
        break;
    }
    if (parsedTypeName != null)
    {
      if (isArray)
        parsedTypeName = parsedTypeName + "[]";
      if (isNullable)
        parsedTypeName = String.Concat("System.Nullable`1[", parsedTypeName, "]");
    }
    else
      parsedTypeName = typeName;
    // Expected to throw an exception in case the type has not been recognized.
    return Type.GetType(parsedTypeName);
  }
}
이것을 사용하는 것은 다음과 같이 작성하는 것만 큼 간단합니다.
Type t;
t = TypeExtensions.GetTypeFromSimpleName("string");
t = TypeExtensions.GetTypeFromSimpleName("int[]");
t = TypeExtensions.GetTypeFromSimpleName("decimal?");
답변
문자열에서 유형 객체를 가져 오려면 다음을 사용하십시오.
Type mytype = Type.GetType(typeName);
그런 다음 이것을 다음으로 전달할 수 있습니다 Activator.CreateInstance().
Activator.CreateInstance(mytype);
답변
비슷한 답변을 본 것 같지만 이것을 파싱 할 시간이 많지 않습니다. 특히, 나는 그들이 여기서 당신이 원하는 것을 정확히하고 있다고 생각합니다.
(String.Format("[{0}]", baseType.Name.ToString())).OfType<T>();
도움이 되었기를 바랍니다. 그렇지 않은 경우 더 구체적으로 알려주세요.
답변
