Подтвердить что ты не робот

Могу ли я проверить, может ли переменная быть указана для указанного типа?

Я пытаюсь проверить, может ли преобразованная переменная быть преобразована в определенный тип. Я пробовал следующее, но не могу его скомпилировать, поэтому я предполагаю, что я ошибаюсь (я новичок в С#)

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;

}
4b9b3361

Ответ 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
}