gpt4 book ai didi

c# - 将类型参数转换为 T

转载 作者:行者123 更新时间:2023-11-30 13:31:11 25 4
gpt4 key购买 nike

我对如何从参数将类型参数传递给方法有点困惑。

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)的通用工厂,并动态创建它的实例。像这样:

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

关于c# - 将类型参数转换为 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681691/

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