繁体   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