- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为 .NET 构建一个 HTTP-API 包装器,它有很多方法可以在对象中设置数据,然后序列化数据并将其发送到我的服务器。允许使用 6 种数据类型:
我的数据属性使用泛型:
SetAttribute<T>(string key, T value)
所以只有一种通用的方法来设置数据。由于我不能将数据类型限制为提到的 6 种,我使用运行时检查并在使用错误的数据类型时抛出异常。
现在解决我的问题:我有两个版本的 SetAttribute,一个接受单个值(T 类型),另一个接受多个值(IEnumerable
SetAttribute("testkey","thing,anotherthing,athirdthing".Split(','))
这默认为单值方法,T 是 String[],这当然会使我的方法抛出异常,因为 String[] 不是有效类型。如果您指定:
SetAttribute<string>("testkey","thing,anotherThing,aThirdThing".Split(','))
运行时选择正确的方法(多值)并且不会抛出异常,因为 T 是字符串。
我的问题:如何标记我的方法,以便类型参数是必需的并且必须显式定义?还是我必须在运行时检测到它并自己重定向到多方法?
最佳答案
好的,这最初是上面的评论,因为它不一定能回答您原来的问题,但会建议另一种方法;
我想说在这种情况下使用公共(public)通用 SetAttribute 不一定是个好主意。
由于类型如此受限,您可能应该只编写重载并将错误从运行时移至编译时。它还允许您使用 IEnumerable<string>
等等,另外 6 个过载并完全消除你遇到的问题。
您始终可以使用私有(private)泛型实现 SetAttribute,并在每次重载时调用它,这将消除一些重复。
它还将或多或少地消除运行时检查的需要,因为类型已经受到编译器的限制。
关于c# - 强制泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12580994/
我是一名优秀的程序员,十分优秀!