替代 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);