簡體   English   中英

C#中具有反射的惰性泛型類型的調用方法

[英]Call method of lazy generic type with reflection in c#

如果IsValueCreated我想用反射調用_baseInfoService的close方法。 我該如何進行反射?

public static partial class ServiceFactory
{
    private static readonly Lazy<ServiceWrapper<IBaseInfoWcfService>> _baseInfoService = 
        new Lazy<ServiceWrapper<IBaseInfoWcfService>>(CreateWrapper<IBaseInfoWcfService>);

    public static IBaseInfoWcfService BaseInfoService => _baseInfoService.Value.Instance;
}
class ServiceWrapper<T>
{
    public T Instance { get; private set; }

    public ServiceWrapper(T instance) {
        Instance = instance;
    }

    public void Close() {

    }
}

public interface IBaseInfoWcfService
{

}

public class BaseInfoWcfServiceImpl : IBaseInfoWcfService
{
    public BaseInfoWcfServiceImpl() {

    }
}

public static partial class ServiceFactory
{
    private static readonly Lazy<ServiceWrapper<IBaseInfoWcfService>> _baseInfoService =
        new Lazy<ServiceWrapper<IBaseInfoWcfService>>(CreateWrapper<IBaseInfoWcfService>);

    public static IBaseInfoWcfService BaseInfoService => _baseInfoService.Value.Instance;

    private static ServiceWrapper<IBaseInfoWcfService> CreateWrapper<T>() where T : IBaseInfoWcfService {
        return new ServiceWrapper<IBaseInfoWcfService>(new BaseInfoWcfServiceImpl());
    }
}

static void Main(string[] args) {
    var baseInfoService = typeof(ServiceFactory).GetField("_baseInfoService", BindingFlags.Static | BindingFlags.NonPublic);
    var instance = baseInfoService.GetValue(null);
    var isValueCreated = (bool)instance.GetType().GetProperty("IsValueCreated").GetValue(instance);

    if (isValueCreated) {
        var value = instance.GetType().GetProperty("Value").GetValue(instance);
        var close = (Action)value.GetType().GetMethod("Close").CreateDelegate(typeof(Action), value);

        close();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM