我对如何从参数传递一个类型参数到一个方法感到有点困惑。
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);
答案 0 :(得分:7)
通用实例化(即将<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 );
}
出于性能原因,您可能还想缓存factory
实例。
更新:从中获得blog post。
答案 1 :(得分:4)
你可以使用泛型来做这件事,但你可以让WriteToStreamAsync
通用吗?
public override Task WriteToStreamAsync<T>(object value,
Stream writeStream, HttpContent content,
TransportContext transportContext, System.Threading.CancellationToken cancellationToken)
{
XElement xmloutput = XElementSerialiser.ToXElement<T>(value);
答案 2 :(得分:0)
我同意D Stanley的回答,但如果您想让编译器推断出要为您序列化的对象的类型,那么每次使用该方法时都不必指定它:
public override Task WriteToStreamAsync<T>(T value,
Stream writeStream, HttpContent content,
TransportContext transportContext, System.Threading.CancellationToken cancellationToken)
{
XElement xmloutput = XElementSerialiser.ToXElement<T>(value);