簡體   English   中英

C#,動態返回類型

[英]C#, dynamic return type

我需要的是一個方法,可以在一個條件后返回一個類型(沒有對象,導致不允許轉換)。 這是一個例子:

??? right (string fullStr, int endPosition)
{
 string tmpStr = "";

 tmpStr = fullStr.Substring(endPosition);

 if(tmpStr.Length == 1)
   return tmpStr[0]; //return a char!!
 else
   return tmpStr; //return a string!!
}

我嘗試了泛型,但我只能返回進入的類型,(如果返回了char中的char,並且返回了字符串中的字符串)。 我試過這個:

    public static T right<T>(T stringToCheck, int endPosition)
    {
        if (typeof(T).ToString() == "System.String")
        {
            string fullString = (string)((object)stringToCheck);
            string response = "";

            response = fullString.Substring(endPosition);

            if (response.Length == 1)
            {

                return (T)((object)response[0]);
            }
            else
                return (T)((object)response);
        }

        return stringToCheck;
    }

我不能使用類型轉換(返回一個對象),不能使用ref params。

對方法的調用必須保持不變:

right(stringOrChar,int) -> returns string or char.

謝謝

我認為這在理論上是不可能的。 您可以在C#4中使用“動態”,但如果您還沒有,那么就不能這樣做。

如果它可以返回一個字符串或一個字符,那么它必須是一個對象,它們都來自哪個“對象”是你唯一的選擇。 然后你必須做演員陣容。

C#(3.5和之前的版本)需要知道方法的單一返回類型是什么,以便它可以檢查調用方法。 事實上,在C#4中,當你說“動態”時,它實際上使用了“對象”。

您可以創建一個包含兩者的自定義類/結構

public class StringOrChar
{
    char charValue;
    string stringValue;
    bool isString;
}

但它很笨拙。

為什么你想要不同的退貨類型?

必須鍵入函數的返回類型。 與任何其他變量或操作一樣,從指定類型繼承的任何類型都是有效的返回值(這就是object允許任何值作為值的原因)。

來電者的后勤工作沒有多大意義; 您如何知道在示例中是否將變量鍵入為charstring

是否有特殊原因導致您無法在所有情況下返回string

你可以out參數。 或返回包含兩種變體的類型。

有很多“左(str,1)<'x'”但其他時候它只是abc = left(str,3)

在這種特殊情況下,您只需返回單字符字符串即可。 比較字符串按照字典順序進行操作,因此這里沒有特別需要使用字符(當然,除非原始作者使用多態來將字符與字符串區別對待,在這種情況下,您有我的同情心)。

方法只能 - 據我所知 - 返回一種類型

所以返回對象和強制轉換是合乎邏輯的選擇

但請注意,如果你的設計迫使你陷入這種困境,那么它可能存在缺陷; 或許更多細節可以幫助我們

注意:jon雙向飛碟免受所有這些限制

那這個呢:

string right(string fullStr, int endPosition, out bool oneChar)
{ 
    string result = fullStr.Substring(endPosition); 
    oneChar = result.Length == 1;
    return result;
}

Enriquev,

如果不改變VBA的語法,就無法實現權利 你可以指定你想要的返回類型,但這基本上是鑄造......

public static U right<T, U>(T input, int index)
{
...
return (U)returnVariable;
}

我真的不認為這可以解決你的問題。

是否可以對單引號括起的所有單個字符進行正則表達式替換? 這將使字符成為字符串並允許比較運算符工作。

這應該工作:

    public static dynamic right(string fullStr, int endPosition)
    {
        string tmpStr = "";

        tmpStr = fullStr.Substring(endPosition);

        if (tmpStr.Length == 1)
            return tmpStr[0]; //return a char!!
        else
            return tmpStr; //return a string!!
    }

測試此代碼:

    static void Main(string[] args)
    {
        var str = right("Hello", 3);
        Console.WriteLine(str.GetType()); // System.String

        var ch = right("Hello", 4);
        Console.WriteLine(ch.GetType()); // System.Char
    }

你想這樣做嗎?

/// <summary>
/// Emulates VB Right Function
/// Returns a string containing a specified number of characters from the right side of a string.
/// </summary>
/// <param name="s"></param>
/// <param name="length">The number of characters to return.</param>
/// <returns>
/// The right <paramref name="length"/> number of characters from the string.
/// If the string has less than or equal to <paramref name="length"/> number of characters,
/// an empty string is returned.
/// </returns>
public static string Right(this string s, int length)
{
    return length > s.Length ? string.Empty : s.Substring(s.Length - length);
}

調用此方法時,您可以執行以下操作:

string myString = "Test String";
string returnedString = mystring.Right(1);
char? myChar = returnedString.Length == 1 ? returnedString[0] : null;
bool isReturnValueAChar = myChar.HasValue;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM