替代 SomeFunction<SomeType.GetType()>(SomeArgument)
Alternative to SomeFunction<SomeType.GetType()>(SomeArgument)
我有一个通用函数如下:
public static T Function<T>(Argument arg)
{
//DO FUNCTION STUFF
}
我想使用从 FieldInfo.FieldType 获得的类型调用此函数,如下所示:
Function<someFieldInfo.FieldType>(arg);
但是,这是不允许的。也不是:
Function<typeof(SomeType)>(arg);
我远不是 C# 专家,如果这是一个愚蠢的问题,请原谅。但为什么这不起作用?我怎样才能解决它以获得类似的功能?
既然你不能接受评论作为答案,我只是想我会写下来听听。
第一个问题:为什么不能将从 fieldInfoInstance.FieldType
获得的 Type
传递给通用函数
如果我理解正确,就像@Lee 指出的那样,从 fieldInfoInstance.fieldType
返回的是一个 class 的实例,它扩展了类型,而泛型函数需要一个类型参数.
第二个问题:你如何解决不能这样做的问题?
我最终按照@silkfire 和@Lee 的建议做了,有一个将类型作为参数而不是通用函数的函数。但是,在使用函数时,我仍然更喜欢泛型函数而不是转换,所以我最终使用了两个函数。
private static object Function(Type type, Arguments args)
{
// DO FUNCTION STUFF
}
和
public static T Function<T>(Arguments args)
{
return (T) Function(typeof(T), args);
}
这样用户仍然可以以通用方式调用该函数,并且这样做不必强制转换返回的对象(在我看来更清晰)我可以调用该函数并传入 Type
。非泛型函数不必是 public 因为我唯一需要使用 Type Instance
而不是 Type Parameter
传递 Type
的时间是递归调用从内部发挥作用。
您可以通过传入一个表达式(从未使用过)告诉编译器强制 T 与 someFieldInfo.Field
相同
public static T Function<T>(Argument arg, Expression<Func<T>> anyField)
{
}
T result = Function(arg, () => someFieldInfo.Field);
但那是在编译时。 C# 中的泛型类型必须在编译时解析。
您想在 运行 时使用 somefieldInfo.FieldType
。对于 运行-time 类型,您不能使用泛型,因为您无法预测类型将是什么。
改为cast the returned object at run-time using Convert.ChangeType。
public static object Function(Argument arg, Type anyFieldType)
{
object result = ...;
return Convert.ChangeType(result, anyFieldType);
}
object result = Function(arg, someFieldInfo.FieldType);
我有一个通用函数如下:
public static T Function<T>(Argument arg)
{
//DO FUNCTION STUFF
}
我想使用从 FieldInfo.FieldType 获得的类型调用此函数,如下所示:
Function<someFieldInfo.FieldType>(arg);
但是,这是不允许的。也不是:
Function<typeof(SomeType)>(arg);
我远不是 C# 专家,如果这是一个愚蠢的问题,请原谅。但为什么这不起作用?我怎样才能解决它以获得类似的功能?
既然你不能接受评论作为答案,我只是想我会写下来听听。
第一个问题:为什么不能将从 fieldInfoInstance.FieldType
获得的 Type
传递给通用函数
如果我理解正确,就像@Lee 指出的那样,从 fieldInfoInstance.fieldType
返回的是一个 class 的实例,它扩展了类型,而泛型函数需要一个类型参数.
第二个问题:你如何解决不能这样做的问题?
我最终按照@silkfire 和@Lee 的建议做了,有一个将类型作为参数而不是通用函数的函数。但是,在使用函数时,我仍然更喜欢泛型函数而不是转换,所以我最终使用了两个函数。
private static object Function(Type type, Arguments args)
{
// DO FUNCTION STUFF
}
和
public static T Function<T>(Arguments args)
{
return (T) Function(typeof(T), args);
}
这样用户仍然可以以通用方式调用该函数,并且这样做不必强制转换返回的对象(在我看来更清晰)我可以调用该函数并传入 Type
。非泛型函数不必是 public 因为我唯一需要使用 Type Instance
而不是 Type Parameter
传递 Type
的时间是递归调用从内部发挥作用。
您可以通过传入一个表达式(从未使用过)告诉编译器强制 T 与 someFieldInfo.Field
相同
public static T Function<T>(Argument arg, Expression<Func<T>> anyField)
{
}
T result = Function(arg, () => someFieldInfo.Field);
但那是在编译时。 C# 中的泛型类型必须在编译时解析。
您想在 运行 时使用 somefieldInfo.FieldType
。对于 运行-time 类型,您不能使用泛型,因为您无法预测类型将是什么。
改为cast the returned object at run-time using Convert.ChangeType。
public static object Function(Argument arg, Type anyFieldType)
{
object result = ...;
return Convert.ChangeType(result, anyFieldType);
}
object result = Function(arg, someFieldInfo.FieldType);