2

これらの 2 つのメソッドを非ジェネリック クラスで宣言し、同じシグネチャを共有します。

    private TypeResolverResult<T> TryRetrieveFromReusable<T>(TypeResolverConfiguration<T> typeResolverConfiguration) where T : class 
    {
        return null;
    }

    private TypeResolverResult<T> BuildNew<T>(TypeResolverConfiguration<T> typeResolverConfiguration) where T : class
    {
        return null;
    }

これらのメソッドの署名を表すデリゲートを作成するにはどうすればよいですか?

私はそれを得ることができないようです、私は試しました:

    private Func<TypeResolverConfiguration<T>, TypeResolverResult<T>> _typeResolveFunc;

しかし、クラスが非ジェネリックであり、変更できないため、明らかにこれは機能しません。

ありがとう

アップデート

これは多かれ少なかれ私が必要とするものです:

    public class Manager : ATypeResolver, IManager
    {
        private neeedDelegate;


        public Manager(RuntimeConfiguration runtimeConfiguration, IList<RepositoryContainer> repositories)
        {
            if (runtimeConfiguration.WhatEver)
            {
                neeedDelegate = TryRetrieveFromReusable;
            }
            else
            {
                neeedDelegate = BuildNew;
            }
        }

        public override TypeResolverResult<T> Resolve<T>() where T : class
        {
            //Want to avoid doing this:

            if (runtimeConfiguration.WhatEver)
            {
                TryRetrieveFromReusable(new TypeResolverConfiguration<T>());
            }
            else
            {
                BuildNew(new TypeResolverConfiguration<T>());
            }

            //and have just this

            neeedDelegate<T>(new TypeResolverConfiguration<T>());
        }

        private TypeResolverResult<T> TryRetrieveFromReusable<T>(TypeResolverConfiguration<T> typeResolverConfiguration) where T : class 
        {
            return null;
        }

        private TypeResolverResult<T> BuildNew<T>(TypeResolverConfiguration<T> typeResolverConfiguration) where T : class
        {
            return null;
        }
    }
4

2 に答える 2

1

更新私が見ることができるものから、 onATypeResolverがある限り、このようなアプローチは機能するはずです:where T : classResolve<T>

public class Manager : ATypeResolver, IManager
{
    private bool tryRetrieveFromReusable;

    public Manager(RuntimeConfiguration runtimeConfiguration, IList<RepositoryContainer> repositories)
    {
        this.tryRetrieveFromReusable = runtimeConfiguration.WhatEver;
    }
    public override TypeResolverResult<T> Resolve<T>()
    {
        var typeResolver = tryRetrieveFromReusable ? (TypeResolver<T>)TryRetrieveFromReusable : BuildNew;

        return typeResolver(new TypeResolverConfiguration<T>());
    }
}

これはカスタムデリゲートタイプを使用します(Funcあなたが持っているようなものも動作するはずです):

public delegate TypeResolverResult<T> TypeResolver<T>(
    TypeResolverConfiguration<T> typeResolverConfiguration) where T : class;

必要に応じて、var typeResolver = ...行を独自のメソッドに移動して、ロジックを分離し、Resolve. そうすれば、Resolve は次のように単純になりますreturn GetTypeResolver<T>()(new TypeResolverConfiguration<T>());

于 2013-07-15T19:31:07.283 に答える