加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在泛型中使用值类型

发布时间:2020-12-15 17:27:43 所属栏目:百科 来源:网络整理
导读:我有以下代码: public class Class1{ void ValueSpecific(string arg) { // do string stuff } void ValueSpecific(int arg) { // do int stuff } void ValueSpecific(float arg) { // do float stuff } void ValueGeneric(string arg) { // do stuff Value
我有以下代码:

public class Class1
{
    void ValueSpecific(string arg)
    {
        // do string stuff
    }
    void ValueSpecific(int arg)
    {
        // do int stuff
    }
    void ValueSpecific(float arg)
    {
        // do float stuff
    }
    void ValueGeneric(string arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void ValueGeneric(int arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void ValueGeneric(float arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void Main(string s,int i,float f)
    {
        ValueGeneric(s);
        ValueGeneric(i);
        ValueGeneric(f);
    }
}

这有效,但ValueGeneric的所有三个重载的机身都是相同的.我想将它们合并为一种方法,它看起来像:

void ValueGeneric<T>(T arg) where T: string,float,int
{
    // do stuff
    ValueSpecific(arg);
    // do more stuff
}

但是,这当然不是有效的C#.
我能想到的最好的是:

void ValueGeneric(object arg)
{
    // Do stuff
    if (arg is int)
    {
        ValueSpecific((int)arg);
    }
    else if (arg is string)
    {
        ValueSpecific((string)arg);
    }
    else if (arg is float)
    {
        ValueSpecific((float)arg);
    }
    else
    {
        Debug.Assert(false,"Invalid type)
    }
    // Do more stuff
}

但这似乎非常不优雅.我很感激任何建议. (虽然我会对任何解决方案感兴趣,但.NET3.5支持的解决方案最好,因为我正在使用它.)

解决方法

假设你在所有重载之前和之后都做了相同的事情,你可以应用通常的方法来分解代码中的不同之处并对它们进行参数化.唯一改变的是传入的参数以及您对该参数执行的操作.将它们都传递进去.

static void ValueGeneric<T>(T arg,Action<T> action)
{
    // do stuff
    action(arg);
    // do more stuff
}

然后使用适当的操作调用泛型方法(您的ValueSpecific重载将很好地解决自己).

ValueGeneric(s,ValueSpecific);
ValueGeneric(i,ValueSpecific);
ValueGeneric(f,ValueSpecific);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读