11

メソッドにパラメーターを与えたいのですが、パラメーターを参照してメソッドがデータを返すようにしたいと考えています。データは boolean、string、int などの型にすることができます。メソッドから変数型を返すにはどうすればよいですか? オブジェクト型を返してから別の型にキャストしたくありません。例えば:

BlaBla VariableReturnExampleMethod(int a)
{
    if (a == 1)
        return "Demo";
    else if (a == 2)
        return 2;
    else if (a == 3)
        return True;
    else
        return null;
}

私がそれを望む理由は、データベースから行の選択された列を読み取るメソッドがあるからです。列のタイプは同じではありませんが、すべての列の情報を返す必要があります。

4

6 に答える 6

18

メソッドから変数型を返すにはどうすればよいですか? オブジェクト型を返してから別の型にキャストしたくありません。

それは基本的にあなたがしなければならないことです。または、C# 4 を使用している場合は、戻り値の型を作成できます。dynamicこれにより、変換を暗黙的にすることができます。

dynamic VariableReturnExampleMethod(int a)
{
    // Body as per question
}

...

// Fine...
int x = VariableReturnExampleMethod(2);

// This will throw an exception at execution time
int y = VariableReturnExampleMethod(1);

基本的に、期待するものをコンパイラに知らせるために型を指定します。タイプが実行時にしかわからない場合、それはどのように機能しますか? バージョンが機能する理由は、基本的にコンパイラに実行時までdynamic通常の作業を延期するように指示するためです。そのため、コンパイル時に2番目の例が失敗する通常の安全性が失われます。

于 2012-05-08T13:42:37.153 に答える
4

ターゲットにする場合はdynamic代わりに Keyword を使用しますが、考えられる他のすべてのクラスの基本クラスであるため、より少ない場合は最も安全な方法です。BlahBlah.Net 4.0object

于 2012-05-08T13:44:33.950 に答える
2

これはジェネリック医薬品の良い例のようです。呼び出すときに期待するデータ型がわかっている場合は、その特定の汎用バージョンの関数を呼び出すことができます。

于 2012-05-08T13:45:16.637 に答える
2

Dapper-dot-net (私たち自身の Stack Overflow で Marc Gravell と Sam Saffron によって書かれた) のようなものを使用して、DB から何かを引き出すことを検討してください。データベースからオブジェクトへのマッピングを処理します。

さらに、ツールを使用したくなく、データベースからプルしていて、コンパイル時にさまざまな列のデータ型を知っている場合 (そう思われるように)、おそらく行で作業する必要があります。列ごとではなく行ごとに。

//Pseudo-code:
List<DatabaseObject> objects = new List<DatabaseObject>();
foreach(var row in DatabaseRows)
{
    var toAdd = new DatabaseObject();
    toAdd.StringTypeVariable = "Demo";
    toAdd.IntTypeVariable = 2;
    toAdd.BoolTypeVariable = true;
    object.Add(toAdd);
}

注: ここではオブジェクト初期化構文と linq を使用できますが、これは、大量の余分なものを使用せずにデモを行うことができる最も基本的な方法です。

また、ここでは、実際には "Demo"、2、および true を返すのではなく、行を使用する値を返したいと想定していることに注意してください。これは、ハードコードされた値を次のように変更することを意味しますrow.GetStringType(stringColumnIdx)

于 2012-05-08T13:47:20.037 に答える
0

リターンタイプをとして使用するobjectと、任意のリターンタイプを取得できます。リフレクションまたは他の方法でリターンタイプのetherを処理する必要があります。

これをチェックして:

void Main()
{
    object aa = VariableReturnExampleMethod(3);
    Console.WriteLine(aa.ToString());
}

object VariableReturnExampleMethod(int a)
{
    if (a == 1)
        return "Demo";
    else if (a == 2)
        return 2;
    else if (a == 3)
        return true;
    else
        return null;
}

編集:私は強く型付けされたオブジェクトを支持しており、.netプラットフォームに簡単に実装できます。

if(returnedValue !=null)
{

string currentDataType = returnedValue.GetType().Name;
object valueObj = GetValueByValidating(currentDataType, stringValue);
}


 public object GetValueByValidating(string strCurrentDatatype, object valueObj)
        {
            if (valueObj != "")
            {
                if (strCurrentDatatype.ToLower().Contains("int"))
                {
                    valueObj = Convert.ToInt32(valueObj);
                }
                else if (strCurrentDatatype.ToLower().Contains("decimal"))
                {
                    valueObj = Convert.ToDecimal(valueObj);
                }
                else if (strCurrentDatatype.ToLower().Contains("double") || strCurrentDatatype.ToLower().Contains("real"))
                {
                    valueObj = Convert.ToDouble(valueObj);
                }
                else if (strCurrentDatatype.ToLower().Contains("string"))
                {
                    valueObj = Convert.ToString(valueObj);
                }
                else
                {
                    valueObj = valueObj.ToString();
                }
            }
            else
            {
                valueObj = null;
            }
            return valueObj;
        }
于 2012-05-08T13:45:12.290 に答える
0

私はあなたの質問を見て、1つは2番目よりも優れていますが、最後に解決策をよりよく理解するために書き直す必要があります. そして、このソリューションは、elseスタックの場合は長くスキップし、必要なすべてのタイプを実装できるTypes enumのforeachに置き換えます。私は動的を使用する方が好きですが、これも使用できます。

メイン関数GetValueByValidatingは、型が定義されていて可能な場合は値を返します。それ以外の場合は false を返しますniranjan-kala を見てください。これが書き換え後のメイン関数です。



            /// 
        /// Enum of wanted types
        /// 
        public enum Types
        {
            [ExtendetFlags("int")]
            INT,
            [ExtendetFlags("decimal")]
            DECIMAL,
            [ExtendetFlags("double")]
            DOUBLE,
            [ExtendetFlags("real")]
            REAL,
            [ExtendetFlags("string")]
            STRING,
            [ExtendetFlags("object")]
            OBJECT,
            [ExtendetFlags("null")]
            NULLABLE
        }
        /// 
        /// Cycle by types when in enum exist string reference on type (helper)
        /// 
        /// 
        /// 
        public static Types GetCurrentType(string container)
        {
            foreach (Types t in Enum.GetValues(typeof(Types)))
            {
                if (container.Contains(t.GetFlagValue()))
                {
                    return t;
                }
            }
            return Types.NULLABLE;
        }
        /// 
        /// Return object converted to type
        /// 
        /// 
        /// 
        /// 
        public static object GetValueByValidating(string strCurrentDatatype, object valueObj)
        {
            var _value = valueObj != null ? valueObj : null;
            try
            {
                Types _current = _value != null ? GetCurrentType(strCurrentDatatype.ToLower()) : Types.NULLABLE;

                switch (_current)
                {
                    case Types.INT:
                        valueObj = Convert.ToInt32(valueObj);
                        break;
                    case Types.DECIMAL:
                        valueObj = Convert.ToDecimal(valueObj);
                        break;
                    case Types.DOUBLE:
                        valueObj = Convert.ToDouble(valueObj);
                        break;
                    case Types.REAL:
                        valueObj = Convert.ToDouble(valueObj);
                        break;
                    case Types.STRING:
                        valueObj = Convert.ToString(valueObj);
                        break;
                    case Types.OBJECT:
                        break;
                    case Types.NULLABLE:
                        throw new InvalidCastException("Type not handled before selecting, function crashed by retype var.");
                }
            } catch (InvalidCastException ex)
            {
                Log.WriteException(ex);
                valueObj = false;
            }

            return valueObj;
        }


于 2016-03-23T08:21:30.357 に答える