gpt4 book ai didi

c# - 如何使用泛型在 C# 中将类型静态绑定(bind)在一起(如 TypeToType)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:43 25 4
gpt4 key购买 nike

假设我有一组 BooleanAttribute 形式的类型, ContinuousAttribute , FiveStarAttribute等。其中每一个都在概念上绑定(bind)到一个值类型(例如 booldoubleint 对于上面的示例。)每个还继承自公共(public)基类 AttributeBase .

假设我有另一个通用类 AttributeUpgrade<Attr>包含 Attr 的一个实例作为成员, 其中Attr继承自 AttributeBase .我还希望它包含在概念上绑定(bind)到 Attr 的值类型的两个实例(旧的和新的) .

使用 C++ 模板,这将是微不足道的。在属性套件的每个类型中,我将为 ValueType 定义一个 typedef,并将我的成员声明为

template <typename Attr>
class AttributeUpgrade
{
Attr attribute;

typename Attr::ValueType old;
typename Attr::ValueType new;
...

到目前为止,C# 中的等效解决方案或任何类似的解决方案都暗示了我。任何解决方案将不胜感激,即使它们涉及撕裂示例中的某些结构。就目前而言,我正朝着放弃类型安全的方向前进,而只是将旧的和新的键入为对象。谢谢!

最佳答案

试试这个:

class AttributeUpgrade<T> where T : Attr
{
T oldOne;
T newOne;
}

请注意 new 是保留关键字。

where 子句是可选的,但您可能希望将使用的类型限制为 Attr

编辑:为了清楚起见,我省略了类和成员的访问说明符,因为我不知道需要什么访问级别。

编辑: 来自评论的回答:

用我的话来说:您希望在 AttributeUpgrade 的声明中重新使用 Attr 的模板参数,而不向 AttributeUpdate 引入新的通用参数。

这不能在 C# 中完成。

你要么需要第二个模板参数,要么求助于在 Attr 的内部类型上使用 GetType() 来获取 System.Type(但正如你意识到这一点,这里没有类型安全)。C++ 通过在类中使用 typedef 解决了这个问题。这里最接近的是别名,但它们无法提供您需要的功能。

请参阅 stackoverflow.com/questions/19790556/c-sharp-typedef-generics。

事实上,我认为这里的“最佳”方法是添加另一个模板参数和运行时(!)断言 Attr 的内部类型等于 AttributeUpgrade 中的内部类型。

关于c# - 如何使用泛型在 C# 中将类型静态绑定(bind)在一起(如 TypeToType<T>)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21086632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com