C# 方法的泛型类型,设置值

C# 方法的泛型类型,设置值,c#,generics,methods,C#,Generics,Methods,我有一个如下的方法,我想用输入字符串设置它的值 我该怎么做呢?如有任何建议,将不胜感激 private static void QueueCheckNAdd<T>(ref T param, string input) { param.DoSomethingLikeSetValue(input); } private static void QueueCheckNAdd(ref T param,字符串输入) { 参数DoSomethingLikeSet

我有一个如下的方法,我想用输入字符串设置它的值

我该怎么做呢?如有任何建议,将不胜感激

private static void QueueCheckNAdd<T>(ref T param, string input)
    {
        param.DoSomethingLikeSetValue(input);
    }
private static void QueueCheckNAdd(ref T param,字符串输入)
{
参数DoSomethingLikeSetValue(输入);
}
作为参考,泛型类型类似于int或double

param = (T)(object)Convert.ChangeType(input, typeof(T));

强制转换是使编译器确信结果确实是
T

类型所必需的。您希望
param
是泛型的(即任何类型),并且希望能够对其调用某些方法,对吗?好的,您可以看到这里的问题:如果
param
可以是任何类型,则无法保证它将具有方法
doSomethingLekeSetValue
(或其他)。我相信您可能会喜欢内省或运行时类型强制,但我认为“干净”的方法是将
T
的类型约束到具有所需方法的某个接口(
doSomethingLekeSetValue
)。像这样:

private static void QueueCheckNAdd<T>(ref T param, string input) where T : IHasSomething {
    param.DoSomethingLikeSetValue(input);
}

public interface IHasSomething {
    void DoSomethingLikeSetValue(string s);
}

好的做法是使用前面描述的接口

但是,如果您想要一些乐趣,您也可以将该对象用作动态对象,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class SMTHG
    {
        public void DoSomethingLikeSetValue(string input)
        {
            Console.WriteLine("HEYYYYY!!! DYNAMIC OBJECTS FTW!...\n" + input);
        }
    }
    class Program
    {
        private static void QueueCheckNAdd<T>(ref T param, string input)
        {
            dynamic dynamicObject = (dynamic)param; 
            dynamicObject.DoSomethingLikeSetValue(input);
        }
        static void Main(string[] args)
        {
            SMTHG smthg = new SMTHG();
            QueueCheckNAdd(ref smthg, "yoyuyoyo");
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
SMTHG类
{
public void DoSomethingLikeSetValue(字符串输入)
{
Console.WriteLine(“HEYYYYY!!!DYNAMIC OBJECTS FTW!。\n”+输入);
}
}
班级计划
{
私有静态void QueueCheckNAdd(参考T参数,字符串输入)
{
动态dynamicObject=(动态)参数;
dynamicObject.DoSomethingLikeSetValue(输入);
}
静态void Main(字符串[]参数)
{
SMTHG SMTHG=新SMTHG();
队列检查NADD(参考smthg,“YOYOUYO”);
}
}
}

如果
T
只能是
int
double
,您可能只需要编写两个具体的方法来使用
int.Parse()
double.Parse()
执行转换。如果您的方法只能用于一小部分固定的类型,那么它就不是真正的泛型方法。使用具体的方法也可以让你不使用强制转换的方法。边注:没有一种真正的方法可以将泛型类型限制为<代码> int <代码> >代码>双<代码> -因此,如果你正在编写代码,你需要验证它是否可以与所有允许的类型一起工作……我想考虑到有一天我可能需要适应。针对不同类型。我的意思是,现在它只分配给int和double的数据类型,但很好的建议是,对于内置类型,你不能这样做,因为你不能向现有类型添加接口……没错,Alexei……这就引出了一个问题:“如果你不能这样做,你应该这样做吗?”最后,如果类型安全是一个巨大的不便,您可能应该考虑使用无类型语言。是的,这个问题可以通过RTTI或其他方法来解决,但它向我表明存在一个更大的架构问题。这也是一个非常好的方法,我会记住这一点。但我会选择SLaks的答案,因为它更干净。虽然它的性能可能会慢一些,但我明白了。非常感谢你
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class SMTHG
    {
        public void DoSomethingLikeSetValue(string input)
        {
            Console.WriteLine("HEYYYYY!!! DYNAMIC OBJECTS FTW!...\n" + input);
        }
    }
    class Program
    {
        private static void QueueCheckNAdd<T>(ref T param, string input)
        {
            dynamic dynamicObject = (dynamic)param; 
            dynamicObject.DoSomethingLikeSetValue(input);
        }
        static void Main(string[] args)
        {
            SMTHG smthg = new SMTHG();
            QueueCheckNAdd(ref smthg, "yoyuyoyo");
        }
    }
}