Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I check if a variable can be cast to a specified type?

I am trying to verify whether a variable that is passed can be converted to a specific type. I have tried the following but can't get it to compile so I assume I'm going about it the wrong way (I'm new to C#)

string myType = "System.Int32"; string myValue = "42";  bool canBeCast = false;  try {   // try to convert the value to it's intended type to see if it's valid.   var result = (Type.GetType(typeString))dataValue;   canBeCast = true; } catch {   canBeCast = false; } 

I'm basically trying to avoid a massive switch statement along the lines of

  switch(myType){     case "System.Int32":       try       {         var convertedValue = Convert.ToInt32(myValue);       }       catch (Exception)       {         canBeConverted = false;       }       break;     case "another type":       ...   } 

EDIT:

Ok, basically I have a db table of known input types that looks like:

CREATE TABLE [dbo].[MetadataTypes] (     [typeName]  VARCHAR (50)  NOT NULL,     [dataType]  VARCHAR (50)  NOT NULL,     [typeRegex] VARCHAR (255) NULL ); 

which may have data such as

"StartTime","System.DateTime",null "TicketId","System.String","$[Ff][0-9]{7}^" 

And the input to my function would be a KeyValuePair along the lines of

myInput = new KeyValuePair<string,string>("StartTime","31/12/2010 12:00"); 

I need to check that the value of the KeyValuePair is of the correct datatype expected by the MetaDataType.

EDIT FOR ANSWER:

Leon got really close to the solution I finally came up with.

For reference my function now looks like this:

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;  } 
like image 588
Nick Avatar asked Aug 12 '11 15:08

Nick


People also ask

How do you cast a type?

Typecasting is making a variable of one type, such as an int, act like another type, a char, for one single operation. To typecast something, simply put the type of variable you want the actual variable to act as inside parentheses in front of the actual variable. (char)a will make 'a' function as a char.

Can you cast a variable?

It is never legal to cast a variable to a variable of another type; variable types are invariant in C#. You can only cast the value stored in the variable to another type.


2 Answers

Use the "as" operator to attempt a cast:

var myObject = something as String;  if (myObject != null) {   // successfully cast } else {   // cast failed } 

If the cast fails, no exception is thrown, but the destination object will be Null.

EDIT:

if you know what type of result you want, you can use a helper method like this:

public static Object TryConvertTo<T>(string input) {     Object result = null;     try     {         result = Convert.ChangeType(input, typeof(T));     }     catch     {     }      return result; } 
like image 90
Leon Avatar answered Sep 16 '22 14:09

Leon


Checkout this link: http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.71).aspx

The is operator is used to check whether the run-time type of an object is compatible with a given type. The is operator is used in an expression of the form:

if (expression is type){     // do magic trick } 

Something you can use?

like image 26
321X Avatar answered Sep 20 '22 14:09

321X