Могу ли я проверить, может ли переменная быть указана для указанного типа?
Я пытаюсь проверить, может ли преобразованная переменная быть преобразована в определенный тип. Я пробовал следующее, но не могу его скомпилировать, поэтому я предполагаю, что я ошибаюсь (я новичок в С#)
string myType = "System.Int32";
string myValue = "42";
bool canBeCast = false;
try
{
// try to convert the value to it intended type to see if it valid.
var result = (Type.GetType(typeString))dataValue;
canBeCast = true;
}
catch
{
canBeCast = false;
}
В основном я стараюсь избегать массивного оператора switch в строках
switch(myType){
case "System.Int32":
try
{
var convertedValue = Convert.ToInt32(myValue);
}
catch (Exception)
{
canBeConverted = false;
}
break;
case "another type":
...
}
EDIT:
Хорошо, в основном у меня есть таблица db известных типов ввода, которая выглядит так:
CREATE TABLE [dbo].[MetadataTypes] (
[typeName] VARCHAR (50) NOT NULL,
[dataType] VARCHAR (50) NOT NULL,
[typeRegex] VARCHAR (255) NULL
);
который может иметь такие данные, как
"StartTime","System.DateTime",null
"TicketId","System.String","$[Ff][0-9]{7}^"
И вход в мою функцию будет KeyValuePair по линиям
myInput = new KeyValuePair<string,string>("StartTime","31/12/2010 12:00");
Мне нужно проверить, что значение KeyValuePair имеет правильный тип данных, ожидаемый в MetaDataType.
ИЗМЕНИТЬ ОТВЕТ:
Леон действительно приблизился к решению, которое я, наконец, придумал.
Для справки моя функция теперь выглядит так:
public Boolean ValidateMetadata(KeyValuePair<string, string> dataItem)
{
// Look for known metadata with name match
MetadataType type = _repository.GetMetadataTypes().SingleOrDefault(t => t.typeName == dataItem.Key);
if (type == null) { return false; }
// Get the data type and try to match to the passed in data item.
Boolean isCorrectType = false;
string typeString = type.dataType;
string dataValue = dataItem.Value;
try
{
var cValue = Convert.ChangeType(dataValue, Type.GetType(typeString));
isCorrectType = true;
}
catch
{
isCorrectType = false;
}
//TODO: Validate against possible regex here....
return isCorrectType;
}
Ответы
Ответ 1
Используйте оператор "как", чтобы попытаться выполнить приведение:
var myObject = something as String;
if (myObject != null)
{
// successfully cast
}
else
{
// cast failed
}
Если приведение не выполнено, исключение не выдается, но конечным объектом будет Null.
РЕДАКТИРОВАТЬ:
если вы знаете, какой тип результата вы хотите, вы можете использовать вспомогательный метод, подобный этому:
public static Object TryConvertTo<T>(string input)
{
Object result = null;
try
{
result = Convert.ChangeType(input, typeof(T));
}
catch
{
}
return result;
}
Ответ 2
Попробуйте это
return myType.IsInstanceOfType(myObject);
Ответ 3
Я думаю, что это то, что вы ищете:
var myValue = "42";
int parsedValue;
if (Int32.TryParse(myValue, out parsedValue)) {
// it worked, and parsedValue is equal to 42
}
else {
// it did not work and parsedValue is unmodified
}
EDIT. Чтобы быть ясными, операторы is
и as
используются следующими способами:
Оператор is
возвращает значение boolean
, чтобы указать, является ли тестируемый объект типом, указанным или реализующим указанный интерфейс. Это как просить компилятор "Является ли моя переменная этим типом?":
var someString = "test";
var result = someString is IComparable; // result will be true
Оператор as
пытается выполнить преобразование и возвращает ссылку null
, если он не может. Это похоже на компилятор "Я бы хотел использовать эту переменную как этот тип":
var someString = "test";
var comparable = someString as IComparable; // comparable will be of type String
Если вы попытались сделать это:
var someString = "42";
// using Int32? because the type must be a reference type to be used with as operator
var someIntValue = someString as Int32?;
Компилятор выдаст ошибку:
Невозможно преобразовать тип с помощью встроенного конвертирования.
Ответ 4
Посмотрите эту ссылку: http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx
Оператор is используется, чтобы проверить, совместим ли тип времени выполнения с данным типом. Оператор is используется в выражении вида:
if (expression is type){
// do magic trick
}
Что-то, что вы можете использовать?
Ответ 5
Вы пробовали TryParse, у которого есть логическое возвращаемое значение, чтобы указать, удалось ли преобразование
Ответ 6
Вы можете выполнить функцию int.TryParse()
:
int myInt;
bool parsed = int.TryParse(myVariable, out myInt);
if (parsed) {
// Do something with myInt or other logic
}