2011-08-12 66 views
28

我想驗證是否可以將傳遞的變量轉換爲特定的類型。我曾嘗試以下,但不能讓它編譯所以我想我會約了錯誤的方式(我是新的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; 
} 

基本上,我試圖避免大規模的開關沿線的聲明

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

編輯:

好了,基本上我認識的輸入類型的數據庫表,看起來像:

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}^" 

數據和輸入我的功能將沿着

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

我需要檢查KeyValuePair的值是正確的線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; 

} 
+0

哪些類型的數據你在期待什麼?你需要處理哪些? – dlev

+1

這不是一個鑄造,它更像是一個轉換 –

+0

ok,Int32只是一個我可能試圖驗證的類型的例子。它可以是日期時間,布爾,小數等。 – Nick

回答

33

使用「爲」運營商試圖鑄造:

var myObject = something as String 

if (myObject != null) 
{ 
    # successfully cast 
} 
else 
{ 
    #cast failed 
} 

如果轉換失敗,不會拋出異常,但目標對象將是空的。

編輯:

,如果你知道你想要什麼類型的搜索結果,你可以使用一個輔助方法是這樣的:

public static Object TryConvertTo<T>(string input) 
{ 
    Object result = null; 
    try 
    { 
     result = Convert.ChangeType(input, typeof(T)); 
    } 
    catch 
    { 
    } 

    return result; 
} 
+1

與'is'類似,你不能只將'string'強制轉換爲int '。即使解析成功,每次都會失敗。 – Yuck

+0

使用System.Convert類? – Leon

+0

你的編輯已經非常接近我的解決方案:)我只需要將類型轉換爲它的名稱。 – Nick

5

我認爲這是你在找什麼:

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 
} 

編輯:只要是明確的,運營商isas用於以下方面...

運算符將返回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?; 

編譯器將發出一個錯誤:

Cannot convert type via a built-in converstion.

1

您是否嘗試過TryParse,它具有布爾返回值來指示轉換是否成功

+2

所以你建議'TryTryParse()'? – dlev

+1

或'TryTryingTryParse()'?! – xandercoded

4

結帳此鏈接: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 
} 

有些事情,你可以使用嗎?

+1

'is'運算符在這種情況下不起作用,因爲'string'與'int'是完全不同的類型。 – Yuck

+0

如果你知道它是什麼類型,爲什麼麻煩解析? – 321X

+1

@ 321X,解析一個數字並不是要搞清楚它是什麼類型*,而是你想要的類型* –

1

你可以做int.TryParse()功能:

int myInt; 
bool parsed = int.TryParse(myVariable, out myInt); 

if (parsed) { 
    // Do something with myInt or other logic 
} 
7

試試這個

return myType.IsInstanceOfType(myObject); 
+0

這對我來說是完美的。我正在編寫一個MVC驗證器,並需要檢查傳遞給我的驗證器IsValid函數的值是否是給定的(可能爲空)類型。 –

相關問題