Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 某些功能的替代品<;SomeType.GetType()>;(一些争论)_C#_.net_Generics_Generic Programming - Fatal编程技术网

C# 某些功能的替代品<;SomeType.GetType()>;(一些争论)

C# 某些功能的替代品<;SomeType.GetType()>;(一些争论),c#,.net,generics,generic-programming,C#,.net,Generics,Generic Programming,我有一个通用函数,如下所示: public static T Function<T>(Argument arg) { //DO FUNCTION STUFF } 公共静态T函数(参数arg) { //做功能性的东西 } 我想使用从FieldInfo.FieldType获得的类型调用此函数,如下所示: Function<someFieldInfo.FieldType>(arg); 函数(arg); 但是,这是不允许的。这两者都不是: Function<

我有一个通用函数,如下所示:

public static T Function<T>(Argument arg)
{
    //DO FUNCTION STUFF
}
公共静态T函数(参数arg)
{
//做功能性的东西
}
我想使用从FieldInfo.FieldType获得的类型调用此函数,如下所示:

Function<someFieldInfo.FieldType>(arg);
函数(arg);
但是,这是不允许的。这两者都不是:

Function<typeof(SomeType)>(arg);
函数(arg);

我远不是一个C#专家,所以如果这是一个愚蠢的问题,请原谅。但是为什么这不起作用呢?我怎样才能绕过它来获得类似的功能呢?

既然你不能接受评论作为答案,我就想我会写出来

第一个问题:为什么不能将从
fieldInfoInstance.FieldType
获得的
Type
传递给通用函数

如果我已经正确理解了所有内容,正如@Lee指出的,从
fieldInfoInstance.fieldType
返回的是一个类的实例,该类扩展了type,而泛型函数需要类型参数

第二个问题:您如何解决无法做到这一点的问题?

我最终像@silkfire和@Lee建议的那样,使用了一个将类型作为参数而不是泛型函数的函数。但是,在使用一个函数时,我仍然更喜欢泛型函数而不是强制转换,因此我最终使用了两个函数

private static object Function(Type type, Arguments args)
{
    // DO FUNCTION STUFF
}

publicstatict函数(参数args)
{
返回(T)函数(typeof(T),args);
}

这样,用户仍然可以以通用的方式调用函数,这样就不必强制转换返回的对象(在我看来非常干净),而且我可以调用函数并传入
类型
。非泛型函数不必是公共函数,因为我唯一需要使用
类型实例而不是
类型参数来传递
类型的时候是从内部递归调用函数。

你可以告诉编译器通过传入强制t与
someFieldInfo.Field
相同表达式(从未使用过)


您可以使用反射来实现这一点,也可以创建一个接受类型参数的重载。这在整个框架中都很常用。@silkfire请原谅我的愚蠢,但是我如何通过反射来做到这一点呢?(这是非常新的)。还有你的另一个选择。您的意思是创建一个重载函数,如:function(Type)?我还没有真正理解类型到底是什么以及为什么它不能被写入,就像你可以看到一个带有该签名的函数只是隐藏了一个强制转换,所以你最好添加一个重载
公共静态对象函数(类型t,参数arg)
并调用:
函数(someFieldInfo.FieldType,arg)
.Type参数是静态解析的,而
someFieldInfo.FieldType
typeof(SomeClass)
返回一个
Type
实例,它是类型的运行时表示形式。在
var x=Function
中,您希望
x
的类型是什么?您试图实现什么?也许你使用了错误的方法来解决你的具体问题。假设
T
必须实现一个接口,您可以返回该接口。谢谢@buffjape的回答。不过我有一个问题。如果我想将返回的对象用作它自己的类型,比如:
ActualType result=(ActualType)函数(arg,someFieldInfo.FieldType)
函数仍然只返回一个对象,不是吗?我想首先使用泛型函数来避免对返回结果的这种强制转换。但是,正如前面提到的,当从fieldInfo.FieldType获取类型时,将类型作为参数传递的线程是唯一的方法。C#中的泛型类型在编译时解析,因此很不幸,您需要另一种语言在运行时执行您想要的操作。
public static T Function<T>(Arguments args)
{
    return (T) Function(typeof(T), args);
}
public static T Function<T>(Argument arg, Expression<Func<T>> anyField)
{
}

T result = Function(arg, () => someFieldInfo.Field);
public static object Function(Argument arg, Type anyFieldType)
{
    object result = ...;

    return Convert.ChangeType(result, anyFieldType);
}

object result = Function(arg, someFieldInfo.FieldType);