web-dev-qa-db-ja.com

変数を指定した型にキャストできるかどうかを確認できますか?

渡された変数が特定の型に変換できるかどうかを確認しようとしています。私は次のことを試しましたが、コンパイルすることができませんので、間違った方法で進んでいると思います(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文を避けようとしています

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

編集:

OK、基本的には次のような既知の入力タイプの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;

}
41
Nick

「as」演算子を使用してキャストを試行します。

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

これを試して

return myType.IsInstanceOfType(myObject);
10
kernowcode

これがあなたが探しているものだと思います:

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演算子は、テスト対象のオブジェクトが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?;

コンパイラーはエラーを発行します。

組み込みの会話を介して型を変換することはできません。

6
Yuck

このリンクをチェックアウトしてください: http://msdn.Microsoft.com/en-us/library/scekt9xw(v = vs.71).aspx

Is演算子は、オブジェクトの実行時の型が特定の型と互換性があるかどうかを確認するために使用されます。 is演算子は、次の形式の式で使用されます。

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

何か使える?

5
321X

TryParse を試しましたか?これは、変換が成功したかどうかを示すブール値の戻り値を持ちます

1
kd7

int.TryParse()関数を実行できます。

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

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