gpt4 book ai didi

c# - 当返回类型是泛型接口(interface)时,如何将对象转换为泛型返回类型?

转载 作者:太空狗 更新时间:2023-10-29 21:56:59 25 4
gpt4 key购买 nike

我有一个非常丑陋的方法,它应该从数据库中提取分类数据,并使用它构造一个请求类型的对象。目标是将各种丑陋的东西拉到一个地方,以便从包含此方法的类派生的类可以相对干净。

我对什么时候应该返回单个对象没有问题,即使类型可以为空:

protected T getValue<T>(ParameterObject myParameterObject)
{
var typeOfT = typeof (T);

if (typeOfT == typeof(bool))
{
string val = this.getValue(myParameterObject);

if (val == null)
return default(T);

bool rVal;
if (!Boolean.TryParse(val, out rVal))
return default(T);

return changeType<T>(rVal);
}

if (typeOfT == typeof (double?))
{
string val = this.getValue(myParameterObject);

if (val == null)
return default(T);

double rVal;
if (!Double.TryParse(val, out rVal))
return default(T);

return changeType<T>(rVal);
}

[...]
}

public static T changeType<T>(object value)
{
var t = typeof(T);
if (!t.IsGenericType || t.GetGenericTypeDefinition() != typeof(Nullable<>))
return (T)Convert.ChangeType(value, t);

if (value == null)
return default(T);

t = Nullable.GetUnderlyingType(t);
return (T)Convert.ChangeType(value, t);
}

不幸的是,在某些情况下,我想要的返回类型是 IList,我想返回一个列表:

protected T getValue<T>(ParameterObject myParameterObject)
{
var typeOfT = typeof (T);

if (typeOfT.IsGenericType)
{
if (typeOfT.GetGenericTypeDefinition() == typeof (IList<>))
{
var genericArgumentType = typeOfT.GenericTypeArguments.FirstOrDefault();
var baseType = typeof (List<>);
var genericType = baseType.MakeGenericType(new[] {genericArgumentType});

var rVal = Activator.CreateInstance(genericType);

[code to populate the list]

return changeType<T>(rVal);
}

[...]
}

我无法返回 rVal,因为它是一个对象,而不是 T 的一个实例。但是我的 changeType() 函数失败了,出现错误:

System.InvalidCastException: Object must implement IConvertible.

所以,我有一个返回类型为 IList 的泛型方法,我有一个对象是 List,但我对它的引用是 Object 类型。我如何转换它以便我可以从函数返回它?

最佳答案

你的 return (T)Convert.ChangeType(value, t);线路失败,因为您的 value对象未实现 IConvertible .

来自 MSDN docs

[...] For the conversion to succeed, value must implement the IConvertible interface, because the method simply wraps a call to an appropriate IConvertible method. The method requires that conversion of value to conversionType be supported.

要解决此问题,我不确定一般方法,但针对 value 的特定情况属于 IEnumerableIEnumerable<>类型,然后你可以尝试转换然后执行 value.Select(x => changeType<ListGenT>(x)) linq 查询。通过使用您的 changeType递归方法,这也应该处理嵌套的泛型类型。

关于c# - 当返回类型是泛型接口(interface)时,如何将对象转换为泛型返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34538216/

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