我如何 return 一个 class 的新实例作为字符串并将其用作泛型方法的参数?

How can I return a new instance of a class as a string and use it as a parameter of a generic method?

我有这个通用方法来解决 fizzbuzz 测验,但是当我使用 class 实例作为该方法的参数时。我得到一个空输出。谁能帮忙解决这个问题。

if input is divisible by 3 output Fizz
divisible by 5 output = Buzz
3 & 5 = FizzBuz<

    private static string FizzBuzz<T>(T item)
    {
        int itemLength = item.ToString().Length;
        string output = "";

        if (itemLength % 3 == 0)
        {
            output += "Fizz";
        }
        if (itemLength % 5 == 0)
        {
            output += "Buzz";
        }

        return output;
    }

这里有一个class

public class UserModel
{
    public string FirstName { get; set; }
    public string  LastName { get; set; }
}

//在main方法中class

static void Main(string[] args)
{
    string result = (FizzBuzz("tests"));
    Console.WriteLine($"Tests: {result}");

    result = FizzBuzz(223);
    Console.WriteLine($"223:{result}");

    result = FizzBuzz ( new UserModel { FirstName = "Vic", LastName = "Okpas"});
    Console.WriteLine($" user model: {result}");
}

输出:

Tests: Buzz
223: Fizz
user model:

用户模型应该输出 Fizz,因为名字有 3 个字母。谁能帮我弄清楚我做错了什么。

关键是 ToString()int itemLength = item.ToString().Length;

让我们稍微重构一下您的程序,看看发生了什么。

static string FizzBuzz<T>(T item)
{
    int itemLength = item.ToString().Length;
    string output = "";

    if (itemLength % 3 == 0)
    {
        output += "Fizz";
    }
    if (itemLength % 5 == 0)
    {
        output += "Buzz";
    }
    Console.WriteLine($"'{item.ToString()}' -> {itemLength} -> '{output}'");
    return output;
}

现在代码如下

FizzBuzz("tests");
FizzBuzz(223);
FizzBuzz(new UserModel
{
    FirstName = "Vic",
    LastName = "Okpas"
});

打印

'tests' -> 5 -> 'Buzz'
'223' -> 3 -> 'Fizz'
'UserModel' -> 9 -> 'Fizz'

问题是 class 的 ToString() 给出了它的名字。

有了这些知识,如果你坚持你的 FizzBu​​zz 应该使用 ToString().Length 作为数字,我们需要做的就是教 ItemModel class 如何 return FirstName 来自 ToString():

public class UserModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override string ToString()
    {
        return FirstName;
    }
}

现在

的输出
FizzBuzz(new UserModel
{
    FirstName = "Vic",
    LastName = "Okpas"
});

'Vic' => 3 -> 'Fizz'

一些笔记

普通的 FizzBu​​zz?

FizzBu​​zz 方法不能真正通用,因为它们的输入实际上是一个数字,没有别的。对于给定类型,这个数字是多少无法在方法内部决定。

这个在我看来比较明智:

static string FizzBuzz(int x)
{
    string output = "";
    if (x% 3 == 0)
    ...
}

// and then

var userModel = new UserModel
{
    FirstName = "Vic",
    LastName = "Okpas"
}

FizzBuzz(userModel.FirstName.Length);

接口

如果你真的想让 FizzBu​​zz 更通用,你可以让它接受和接口。

static string FizzBuzz(IForFizzBuzz item)
{
    int x = item.NumberForFizzBuzz;
    string output = "";

    if (x % 3 == 0)
    {
        output += "Fizz";
    }
    if (x % 5 == 0)
    {
        output += "Buzz";
    }
    Console.WriteLine($"'{x} -> '{output}'");
    return output;
}

public class UserModel: IForFizzBuzz
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int NumberForFizzBuzz => FirstName.Length;
}

public interface IForFizzBuzz { 
    public int NumberForFizzBuzz {get; }

}

然后你可以用你的模型调用它

FizzBuzz(new UserModel
{
    FirstName = "Vic",
    LastName = "Okpas"
});

泛型与对象

由于 C# 中的所有类型都提供 ToString() 您的方法版本无法从泛型中获益,只能接受 object

static string FizzBuzz(object item)
{
    int itemLength = item.ToString().Length;
    string output = "";
...