具有通用类型的方法,设置值

时间:2016-03-08 01:30:59

标签: c# generics methods

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

我该怎么办?任何建议将不胜感激

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

供您参考,泛型类型类似于int或double

3 个答案:

答案 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