У меня есть 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?");
источник
Чтобы просто получить объект типа из строки, используйте:
Затем вы можете передать это
Activator.CreateInstance()
:источник
У меня нет времени разбираться в этом, хотя я думаю, что видел некоторые похожие ответы. В частности, я думаю, что они делают именно то, что вы здесь хотите:
Ошибка общего репозитория Entity Framework
(String.Format("[{0}]", baseType.Name.ToString())).OfType<T>();
Надеюсь, это поможет, дайте мне знать более конкретно, если это не так.
источник