В Python 3.x для целых чисел вы можете использовать all
с range
:
if all(x in range(7) for x in (a, b, c)):
# your logic
Для нецелых чисел или в Python 2.x вы можете использовать цепочечные операции:
if all(0 <= x <= 6 for x in (a, b, c)):
# your logic
Проблема с вашей логикой в том, что Python не реализует векторизованные операции с операторами сравнения.
Имейте в виду, что класс String неизменен. Он не может быть изменен после его создания. Это объясняет, почему у него нет конструктора без параметра, он никогда не может генерировать полезный объект String, отличный от пустой строки. Это уже доступно в языке C #, оно «».
То же самое рассуждение относится к конструктору строки (строки). Нет смысла дублирования строки, строку, которую вы передаете конструктору, уже является совершенно хорошим экземпляром строки.
Итак, исправьте свою проблему путем тестирования для корпуса строки:
var oType = oVal.GetType();
if (oType == typeof(string)) return oVal as string;
else return Activator.CreateInstance(oType, oVal);
Похоже, вы пытаетесь вызвать конструктор, который просто берет строку - а такого конструктора не существует. Если вы уже получили строку, почему вы пытаетесь создать новую? (Когда вы не предоставили никаких дополнительных аргументов, вы пытались вызвать конструктор без параметров - который опять же не существует.)
Обратите внимание, что typeof(string)
- это более простой способ получить ссылку на строковый тип.
Не могли бы вы дать нам больше информации о более широкой картине того, что вы пытаетесь сделать?
Строка на самом деле не имеет конструктора, который принимает строку в качестве входных данных. Существует конструктор, который принимает массив символов, поэтому он должен работать:
var sz = Activator.CreateInstance ("".GetType (), "Test".ToCharArray ());
Это то, что я использую в своих проектах. Что касается необходимости создания экземпляра типа объекта и незнания во время разработки, для меня это вполне нормально. Возможно, вы перебираете свойства объекта и хотите создать все из них динамически. Мне много раз приходилось создавать, а затем присваивать значения объектам POCO, не являющимся экземплярами ... с помощью приведенного ниже кода вы можете использовать строковое значение, хранящееся в БД, для создания экземпляра объекта, а также для создания объекта, хранящегося в библиотеке, которая ссылается на ваш библиотека - так что вы также можете обойти ошибки круговой ссылки ... Надеюсь, это поможет.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
/// <summary>
/// Instantiates an object. Must pass PropertyType.AssemblyQualifiedName for factory to operate
/// returns instantiated object
/// </summary>
/// <param name="typeName"></param>
/// <returns></returns>
public static object Create(string typeAssemblyQualifiedName)
{
// resolve the type
Type targetType = ResolveType(typeAssemblyQualifiedName);
if (targetType == null)
throw new ArgumentException("Unable to resolve object type: " + typeAssemblyQualifiedName);
return Create(targetType);
}
/// <summary>
/// create by type of T
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T Create<T>()
{
Type targetType = typeof(T);
return (T)Create(targetType);
}
/// <summary>
/// general object creation
/// </summary>
/// <param name="targetType"></param>
/// <returns></returns>
public static object Create(Type targetType)
{
//string test first - it has no parameterless constructor
if (Type.GetTypeCode(targetType) == TypeCode.String)
return string.Empty;
// get the default constructor and instantiate
Type[] types = new Type[0];
ConstructorInfo info = targetType.GetConstructor(types);
object targetObject = null;
if (info == null) //must not have found the constructor
if (targetType.BaseType.UnderlyingSystemType.FullName.Contains("Enum"))
targetObject = Activator.CreateInstance(targetType);
else
throw new ArgumentException("Unable to instantiate type: " + targetType.AssemblyQualifiedName + " - Constructor not found");
else
targetObject = info.Invoke(null);
if (targetObject == null)
throw new ArgumentException("Unable to instantiate type: " + targetType.AssemblyQualifiedName + " - Unknown Error");
return targetObject;
}
/// <summary>
/// Loads the assembly of an object. Must pass PropertyType.AssemblyQualifiedName for factory to operate
/// Returns the object type.
/// </summary>
/// <param name="typeString"></param>
/// <returns></returns>
public static Type ResolveType(string typeAssemblyQualifiedName)
{
int commaIndex = typeAssemblyQualifiedName.IndexOf(",");
string className = typeAssemblyQualifiedName.Substring(0, commaIndex).Trim();
string assemblyName = typeAssemblyQualifiedName.Substring(commaIndex + 1).Trim();
if (className.Contains("[]"))
className.Remove(className.IndexOf("[]"), 2);
// Get the assembly containing the handler
Assembly assembly = null;
try
{
assembly = Assembly.Load(assemblyName);
}
catch
{
try
{
assembly = Assembly.LoadWithPartialName(assemblyName);//yes yes this is obsolete but it is only a backup call
}
catch
{
throw new ArgumentException("Can't load assembly " + assemblyName);
}
}
// Get the handler
return assembly.GetType(className, false, false);
}
Вы пытаетесь сделать это:
var sz = new string();
Попробуйте скомпилировать его, вы поймете свою ошибку.
Вы можете попробовать:
var sz = Activator.CreateInstance(typeof(string), new object[] {"value".ToCharArray()});
, но он выглядит бесполезно, вы должны напрямую использовать значение ...