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");
}
}
}