won*_*nea 3 c# generics xelement xmlserializer
我对如何将一个类型参数传递给一个参数的方法感到有点困惑.
public class MyNamespaceXmlFormatter : XmlMediaTypeFormatter
{
public override Task WriteToStreamAsync(Type type, object value,
Stream writeStream, HttpContent content,
TransportContext transportContext, System.Threading.CancellationToken cancellationToken)
{
XElement xmloutput = XElementSerialiser.ToXElement<type>(value);
...........
Run Code Online (Sandbox Code Playgroud)
我尝试了以下,但这些也失败了;
XElement xmloutput = XElementSerialiser.ToXElement<(T)type>(value);
XElement xmloutput = XElementSerialiser.ToXElement<typeof(type)>(value);
Run Code Online (Sandbox Code Playgroud)
显然这是编译,但没有多大意义;
XElement xmloutput = XElementSerialiser.ToXElement<Type>(value);
Run Code Online (Sandbox Code Playgroud)
通用实例化(即添加<T>到签名)是编译时构造,而Type对象存在于运行时.
正如D Stanley所建议的那样,最好使整个方法具有通用性,而不是完全传递一个Type对象.
但是,如果您无法做到这一点,您可以使自己成为具有非通用接口的通用工厂,并动态创建它的实例.像这样:
interface IFactory {
XElement ToXElement( object value );
}
class Factory<T> : IFactory {
public XElement ToXElement( object value ) {
return XElementSerialiser.ToXElement<T>( value );
}
}
public override Task WriteToStreamAsync( Type type, object value,
Stream writeStream, HttpContent content,
TransportContext transportContext, System.Threading.CancellationToken cancellationToken) {
var factory = Activator.CreateInstance( typeof( Factory<> ).MakeGenericType( type ) ) as IFactory;
return factory.ToXElement( value );
}
Run Code Online (Sandbox Code Playgroud)
出于性能原因,您可能还希望缓存factory实例.
更新:发表了一篇博客文章.
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |