c# – 将Type参数转换为T.
作者:互联网
我对如何将一个类型参数传递给一个参数的方法感到有点困惑.
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);
...........
我尝试了以下,但这些也失败了;
XElement xmloutput = XElementSerialiser.ToXElement<(T)type>(value);
XElement xmloutput = XElementSerialiser.ToXElement<typeof(type)>(value);
显然这是编译,但没有多大意义;
XElement xmloutput = XElementSerialiser.ToXElement<Type>(value);
解决方法:
通用实例化(即,将< 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 );
}
出于性能原因,您可能还希望缓存工厂实例.
更新:从中获得了blog post.
标签:c,xmlserializer,generics,xelement 来源: https://codeday.me/bug/20190716/1477325.html