2017-06-24 48 views
1

我有一个通用的功能如下:替代SomeFunction <SomeType.GetType()>(SomeArgument)

public static T Function<T>(Argument arg) 
{ 
    //DO FUNCTION STUFF 
} 

我想用一个I型从FieldInfo.FieldType得到像这样调用这个函数:

Function<someFieldInfo.FieldType>(arg); 

但是,这是不允许的。而且也不是:

Function<typeof(SomeType)>(arg); 

我很远从C#专家,所以借口,如果这是一个愚蠢的问题。但为什么这不起作用?我怎样才能解决它以获得类似的功能?

+1

您可以使用反射来做到这一点,也可以创建一个接受类型参数的重载。这在整个框架中都很常用。 – silkfire

+1

@silkfire原谅我的愚蠢,但我会怎么做反思? (对此很新颖)。而你的另一种选择。你的意思是做一个重载函数,如:Function(Type type)?我没有重新说明类型究竟是什么以及它为什么不能被写入<>的像你可以

+2

带有该签名的函数只是隐藏了一个转换,所以你还可以添加一个重载'public static object函数(类型t,参数arg)'并调用:'Function(someFieldInfo.FieldType,arg)'。 – Lee

回答

1

既然你不能接受评论作为答案,我只是觉得我会写它听到。

第一个问题:你为什么不能传递Type你从fieldInfoInstance.FieldType到一个通用的功能

如果我理解正确的一切,它是作为@Lee指出,从fieldInfoInstance.fieldType返回什么一个扩展类型的类的实例,其中泛型函数需要类型参数。

第二个问题:你如何解决不能这样做的问题?

我最终做了像@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。非泛型函数不必公开,因为我需要通过使用Type Instance而不是Type Parameter来通过Type的唯一时间是从内部递归调用函数。

1

你可以告诉编译器传递一个表达力T是相同someFieldInfo.Field(这是从来没有使用过)

public static T Function<T>(Argument arg, Expression<Func<T>> anyField) 
{ 
} 

T result = Function(arg,() => someFieldInfo.Field); 

但是,这是在编译时。 C#中的泛型类型必须在编译时解析。您想在运行时使用somefieldInfo.FieldType。对于运行时类型,您不能使用泛型,因为您无法预测类型是什么。

而是cast the returned object at run-time使用Convert.ChangeType

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

    return Convert.ChangeType(result, anyFieldType); 
} 

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

感谢您的答案@buffjape。我有一个问题,但。如果我想使用它作为自己的类型,就不需要使用你的方法来投射返回的对象,如:'ActualType result =(ActualType)Function(arg,someFieldInfo.FieldType)'该函数仍然只返回一个对象doesn是吗?我想首先使用泛型函数来避免返回结果的转换。但是,如前所述,在将类型作为参数传递的线程中,只有从fieldInfo.FieldType获取类型时才能做到这一点。 –

+0

C#中的泛型类型在编译时解析,所以不幸的是,在运行时您需要使用不同的语言来完成您想要的功能。 – buffjape