我有一个关于泛型的问题,并认为这可能是不可能的,但我认为Id会把它扔出去,希望找到某种解决方案。 我有一个使用泛型的对象,我想动态设置泛型。我的问题是,或者反射只能让我到目前为止的原因是,对象需要作为out param发送到方法中。有什么建议?代码在
之下GetConfigurationSettingMessageResponse<DYNAMICALLYSETTHIS> ch;
if (MessagingClient.SendSingleMessage(request, out ch))
{
if (ch.ConfigurationData != null)
{
data = ch.ConfigurationData;
}
}
答案 0 :(得分:1)
如何制作通用便捷方法,然后使用reflection to call it。
void HelperMethod<TType>(){
GetConfigurationSettingMessageResponse<TType> ch;
if (MessagingClient.SendSingleMessage(request, out ch))
{
... //Do your stuff.
}
}
答案 1 :(得分:0)
更多的解决方法而不是直接的答案,但您是否必须编写如此强类型的代码?也许你把它留作GetConfigurationSettingMessageResponse<object>
并在稍后阶段进行测试,看看它是什么:
void SendSingleMessage(int request, out GetConfigurationSettingMessageResponse<object> obj)
{
if (obj.InnerObject is Class1)
{...}
else if...
..
}
...
class GetConfigurationSettingMessageResponse<T>
{
public T _innerObject { get; set; }
}
答案 2 :(得分:0)
编辑:基本上,您需要传入对编译时无法知道的类型的引用。在这种情况下,我们需要用反射来打败编译时检查。
using System.Reflection;
public class ResponseWrapper {
public static ConfigurationData GetConfiguration( Request request, Type dtype )
{
// build the type at runtime
Type chtype = typeof(GetConfigurationSettingMessgeResponse<>);
Type gchtype = chtype.MakeGenericType( new Type[] { dtype } );
// create an instance. Note, you'll have to know about your
// constructor args in advance. If the consturctor has no
// args, use Activator.CreateIntsance.
// new GetConfigurationSettingMessageResponse<gchtype>
object ch = Activator.CreateInstance(gchtype);
// now invoke SendSingleMessage ( assuming MessagingClient is a
// static class - hence first argument is null.
// now pass in a reference to our ch object.
MethodInfo sendsingle = typeof(MessagingClient).GetMethod("SendSingleMessage");
sendsingle.Invoke( null, new object[] { request, ref ch } );
// we've successfulled made the call. Now return ConfigurtationData
// find the property using our generic type
PropertyInfo chcd = gchtype.GetProperty("ConfigurationData");
// call the getter.
object data = chcd.GetValue( ch, null );
// cast and return data
return data as ConfigurationData;
}
}
完成此操作后,您可以创建一个帮助方法,让您手动操作ch对象而不是GetProperty部分。