动态设置泛型

本文关键字:泛型 设置 动态 | 更新日期: 2023-09-27 17:50:37

我有一个泛型的问题,并认为这可能是不可能的,但我认为我把它扔在那里,希望找到某种解决方案。我有一个使用泛型的对象,我想动态设置泛型。我的问题是,或者反射只能让我到目前为止的原因是,对象需要作为输出参数发送到方法中。有什么建议吗?代码在

下面
GetConfigurationSettingMessageResponse<DYNAMICALLYSETTHIS> ch;
if (MessagingClient.SendSingleMessage(request, out ch))
{
    if (ch.ConfigurationData != null)
    {
        data = ch.ConfigurationData;
    }
}

动态设置泛型

创建一个通用的方便方法,然后使用反射来调用它。

void HelperMethod<TType>(){
    GetConfigurationSettingMessageResponse<TType> ch;
    if (MessagingClient.SendSingleMessage(request, out ch))
    {
        ... //Do your stuff.
    }
}

这是一种解决方法,而不是直接回答,但是您必须编写如此强类型的代码吗?也许您将其保留为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; }
    }

EDITED:本质上,您需要传递对编译时无法知道的类型的引用。在这种情况下,我们需要用反射来克服编译时检查。

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部分。