2011-08-12 30 views
28

Tôi đang cố gắng xác minh xem một biến được truyền có thể được chuyển đổi thành một loại cụ thể hay không. Tôi đã thử những điều sau đây nhưng không thể làm cho nó để biên dịch vì vậy tôi giả sử tôi đang đi về nó một cách sai lầm (Tôi mới đến C#)Tôi có thể kiểm tra xem một biến có thể được truyền sang một loại được chỉ định không?

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; 
} 

Tôi đang cố gắng tránh một công tắc lớn tuyên bố dọc theo dòng của

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

EDIT:

Ok, về cơ bản tôi có một bảng db của các loại đầu vào được biết đến giống như:

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

có thể có dữ liệu như

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

Và đầu vào chức năng của tôi sẽ là một KeyValuePair dọc theo dòng của

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

Tôi cần phải kiểm tra xem giá trị của KeyValuePair là đúng datatype được mong đợi bởi MetaDataType.

EDIT CHO ĐÁP:

Leon đã thực sự gần với giải pháp cuối cùng tôi đã đưa ra.

Để tham khảo chức năng của tôi bây giờ trông như thế này:

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

loại gì về dữ liệu Bạn có kỳ vọng không? Bạn được yêu cầu xử lý? – dlev

+1

nó không phải là một diễn viên, nó là một chuyển đổi –

+0

ok, Int32 chỉ là một ví dụ về một loại tôi có thể cố gắng để xác nhận. Nó có thể là DateTime, Boolean, Decimal, v.v. – Nick

Trả lời

33

Sử dụng "là" nhà điều hành để cố gắng một dàn diễn viên:

var myObject = something as String 

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

Nếu các diễn viên thất bại, không có ngoại lệ được ném ra, nhưng đối tượng đích sẽ là Null.

EDIT:

nếu bạn biết những gì loại kết quả bạn muốn, bạn có thể sử dụng một phương pháp helper như thế này:

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

    return result; 
} 
+1

Tương tự như 'is', bạn không thể đúc' chuỗi' thành 'int '. Điều này sẽ thất bại mỗi lần ngay cả khi phân tích cú pháp thành công. – Yuck

+0

Sử dụng lớp System.Convert? – Leon

+0

Chỉnh sửa của bạn rất gần với giải pháp của tôi :) Tôi chỉ cần để có được loại chuyển đổi từ tên của nó. – Nick

5

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm:

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: Chỉ cần được rõ ràng, các nhà khai thác isas được sử dụng theo các cách sau ...

Nhà điều hành is sẽ trả lại Giá trị boolean để cho biết đối tượng đang được thử nghiệm hay không loại được chỉ định hoặc triển khai giao diện được chỉ định. Nó giống như yêu cầu trình biên dịch "là biến tôi kiểu này?":

var someString = "test"; 
var result = someString is IComparable; // result will be true 

Nhà điều hành as cố gắng để thực hiện việc chuyển đổi, và trả về một tham chiếu null nếu nó không thể.Đây cũng giống như nói với trình biên dịch "Tôi muốn sử dụng biến này như kiểu này":

var someString = "test"; 
var comparable = someString as IComparable; // comparable will be of type String 

Nếu bạn đã cố gắng để làm điều này:

var someString = "42"; 
// using Int32? because the type must be a reference type to be used with as operator 
var someIntValue = someString as Int32?; 

Trình biên dịch sẽ phát hành một lỗi:

Cannot convert type via a built-in converstion.

1

Bạn đã thử TryParse có giá trị trả lại boolean để cho biết liệu chuyển đổi có thành công hay không

+2

Vì vậy, bạn đang đề xuất 'TryTryParse()'? – dlev

+1

hoặc 'TryTryingTryParse()' ?! – xandercoded

4

Thanh toán liên kết này: 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 bạn có thể sử dụng không?

+1

Toán tử 'is' sẽ không hoạt động trong trường hợp này bởi vì một' chuỗi' là một kiểu hoàn toàn khác với 'int'. – Yuck

+0

Nếu bạn biết loại đó là gì, tại sao phải phân tích cú pháp? – 321X

+1

@ 321X, phân tích một số không phải là tìm ra loại * đó là *, nhưng loại * bạn muốn nó là. * –

1

Bạn có thể làm int.TryParse() chức năng:

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

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

Hãy thử điều này

return myType.IsInstanceOfType(myObject); 
+0

Điều này hoàn hảo cho mục đích của tôi. Tôi đang viết một trình xác nhận MVC và cần kiểm tra nếu một giá trị được chuyển vào trong trình xác nhận hợp lệ của tôi, hàm IsValid có phải là một kiểu (có thể không có giá trị) đã cho. –

Các vấn đề liên quan