我有一个类似下面的方法,我想用输入字符串设置它的值。
我该怎么办?任何建议将不胜感激
private static void QueueCheckNAdd<T>(ref T param, string input)
{
param.DoSomethingLikeSetValue(input);
}
供您参考,泛型类型类似于int或double
答案 0 :(得分:2)
param = (T)(object)Convert.ChangeType(input, typeof(T));
强制转换必须说服编译器结果实际上是T
类型。
答案 1 :(得分:2)
您希望param
是通用的(即任何类型),和您希望能够在其上调用某些方法,对吗?那么,你可以在那里看到问题:如果param
可以是任何类型,则无法保证它将具有方法DoSomethingLikeSetValue
(或其他)。我确信你可以对内省或运行时类型强制感到满意,但我认为你正在寻找的“干净”方法是将T
的类型约束到具有所需方法的某个接口(DoSomethingLikeSetValue
)。像这样:
private static void QueueCheckNAdd<T>(ref T param, string input) where T : IHasSomething {
param.DoSomethingLikeSetValue(input);
}
public interface IHasSomething {
void DoSomethingLikeSetValue(string s);
}
然后,只有在泛型类型支持QueueCheckNAdd
接口时,才可以一般性地调用IHasSomething
。所以你可以像这样使用它:
public class Foo : IHasSomething {
public void DoSomethingLikeSetValue(string s) {
Console.WriteLine(s);
}
}
var f = new Foo();
QueueCheckNAdd<Foo>(f, "hello");
答案 2 :(得分:1)
良好的做法是使用前面描述的界面,
但是如果你想要一些乐趣,你可以将对象用作动态对象,如下所示:
security