C#通用类和WCF铸造

C#通用类和WCF铸造,c#,wcf,generics,casting,C#,Wcf,Generics,Casting,我想编写一个泛型类,该类应该使用不同的泛型参数对自身进行强制转换 class Base {} class Inherited : Base {} class MyGeneric<T> {} // WCF Service interface void Foo(MyGeneric<Base> b); // somewhere else MyGeneric<Inherited> inherited; Foo(inherited) 类基类{} 继承的类:基{}

我想编写一个泛型类,该类应该使用不同的泛型参数对自身进行强制转换

class Base {}
class Inherited : Base {}

class MyGeneric<T> {}

// WCF Service interface
void Foo(MyGeneric<Base> b);

// somewhere else
MyGeneric<Inherited> inherited;
Foo(inherited)
类基类{}
继承的类:基{}
类MyGeneric{}
//WCF服务接口
void Foo(myb);
//其他地方
我的基因遗传;
傅(继承)
我知道这可以在C#4.0中实现,但目前还没有用

  • 我可以为每个
    MyGeneric
    星座编写一个专门的类,并在那里编写一个隐式类型转换器或实现某个接口。但我想避免这种情况
  • 我可以有一个没有泛型的接口,但在本例中,泛型的整体意义是在方法Foo上获得编译时类型安全性。所以这不是一个选择
  • 因为Foo是一个操作契约,所以它本身不能是泛型的
你想知道如何在C#3.0中解决这个问题吗?

你想:

void Foo<T>(MyGeneric<T> b) where T : Base {}
void Foo(MyGeneric b)其中T:Base{}
您需要:

void Foo<T>(MyGeneric<T> b) where T : Base {}
void Foo(MyGeneric b)其中T:Base{}

我写了这个铸造方法

public MyGeneric<TTarget> Cast<TTarget, TSource>()
  where TTarget : class
  where TSource : TTarget, T
{
  return new MyGeneric<TTarget>();
}
public MyGeneric Cast()
目标:类
其中T来源:T目标,T
{
返回新的MyGeneric();
}
可以这样称呼

MyGeneric<Inherited> inherited;
Foo(inherited.Cast<Base, Inherited>());
MyGeneric;
Foo(继承的.Cast());
丑陋的是,我们必须提供已经存在的类。可能会有一些改进


顺便说一下,为了避免第二个泛型参数,我无法将其作为一个扩展方法。

我编写了这个强制转换方法

class Base {}
class Inherited : Base {}

class MyGeneric<T> {}

// WCF Service interface
void Foo(MyGeneric<Base> b);

// somewhere else
MyGeneric<Inherited> inherited;
Foo(inherited)
public MyGeneric<TTarget> Cast<TTarget, TSource>()
  where TTarget : class
  where TSource : TTarget, T
{
  return new MyGeneric<TTarget>();
}
public MyGeneric Cast()
目标:类
其中T来源:T目标,T
{
返回新的MyGeneric();
}
可以这样称呼

MyGeneric<Inherited> inherited;
Foo(inherited.Cast<Base, Inherited>());
MyGeneric;
Foo(继承的.Cast());
丑陋的是,我们必须提供已经存在的类。可能会有一些改进

顺便说一下,为了避免第二个泛型参数,我无法将其作为扩展方法

class Base {}
class Inherited : Base {}

class MyGeneric<T> {}

// WCF Service interface
void Foo(MyGeneric<Base> b);

// somewhere else
MyGeneric<Inherited> inherited;
Foo(inherited)
在本例中,泛型的整体意义是在方法Foo上获得编译时类型安全性

以这种方式强制转换(到不在实例祖先中的类型)的目的是破坏类型安全性。不要破坏类型安全以保存类型安全

在本例中,泛型的整体意义是在方法Foo上获得编译时类型安全性


以这种方式强制转换(到不在实例祖先中的类型)的目的是破坏类型安全性。不要破坏类型安全性来保存类型安全性。

哦,是的,这在“内部”起作用,我忘了提到Foo也是一个ServiceContract…你是指OperationContract吗?是的,我是指OperationContract,那么我不确定它在WCF下是否“可行”,除了列表类型(具有不同的处理方式)。尝试编写强制转换方法。这有点安全,但也有点尴尬。看看我自己的答案。哦,是的,这是“内部”工作的,我忘了提到Foo也是一个ServiceContract…你是指一个OperationContract吗?是的,我是指一个OperationContract,那么我不确定它在WCF下是否“可行”,除了列表类型(具有不同的处理方式)。尝试编写一个Cast方法。这有点安全,但也有点尴尬。看看我自己的答案。这就是我要说的。我不能告诉C#只允许具有从接口中派生的泛型参数的类型。我不想在任何地方破坏类型安全性。像MyGeneric是MyGeneric的父级一样工作会破坏类型安全性。如果我有一个基参数并将传递一个继承的实例,那就好了。这是正常的,类型安全的多态性。MyGeneric实际上是业务对象的包装器,您可以将其视为业务对象描述符。它替换Base类型的参数。对于泛型类,我得到了不兼容的类型。目标是找回多态性。是的。这就是我要说的。我不能告诉C#只允许具有从接口中派生的泛型参数的类型。我不想在任何地方破坏类型安全性。像MyGeneric是MyGeneric的父级一样工作会破坏类型安全性。如果我有一个基参数并将传递一个继承的实例,那就好了。这是正常的,类型安全的多态性。MyGeneric实际上是业务对象的包装器,您可以将其视为业务对象描述符。它替换Base类型的参数。对于泛型类,我得到了不兼容的类型。目标是找回多态性。