Приведите экземпляр в список к его универсальному c интерфейсу - PullRequest
0 голосов
/ 08 марта 2020

У меня есть список экземпляров BasicReference и TaggableReference, который реализует обобщенный c интерфейс IReference

BasicReference.cs

namespace DefaultNamespace
{
    public class BasicReference : IReference<string>
    {
        public string Resolve(string name)
        {
            return name;
        }

        public bool Valid(string name)
        {
            return (name != null);
        }
    }
}

TaggableReference.cs

namespace DefaultNamespace
{
    public class TaggableReference : IReference<(string,string)>
    {
        public (string,string) Resolve(string name)
        {
            return (name + "1",name + "2");
        }

        public bool Valid(string name)
        {
            return (name != null);
        }
    }
}

IReference.cs

namespace DefaultNamespace
{
    public interface IReference<out T>
    {
        T Resolve(string name);
        bool Valid(string name);
    }
}

Я могу добавить BasicReference и TaggableReference в список, где параметр Type является объектом. Но как мне привести их к вызову методов из IReference? И какой тип я возвращаю из метода?

using System.Collections.Generic;

namespace DefaultNamespace
{
    public class Test
    {
        private List<object> references = new List<object>();

        public ??? Test()
        {
            references.Add(new BasicReference());
            references.Add(new TaggableReference());

            string referenceExample = "example";

            foreach (var reference in references)
            {
                // How can I cast this so I can call IReference methods and return the type
                // What type do I return from method?
                if (reference.Valid(referenceExample))
                {
                    ??? result = reference.Resolve(referenceExample);    
                } 
            }
        }
    }
}

1 Ответ

1 голос
/ 08 марта 2020

Пока вы знаете тип, который ожидаете при вызове метода Test(), вы также можете сделать этот метод обобщенным c и вернуть ссылку для данного типа:

public T Test<T>()
{
    references.Add(new TaggableReference());
    references.Add(new BasicReference());

    string referenceExample = "example";

    foreach (var reference in references.OfType<IReference<T>>())
    {
        if (reference.Valid(referenceExample))
        {
            return reference.Resolve(referenceExample);
        }
    }

    return default; // Handle type not found accordingly
}

Использование этого будет:

var reference = test.Test<string>();
Console.WriteLine(reference);

var taggableReference = test.Test<(string, string)>();
Console.WriteLine(taggableReference);

, который производит ожидаемый результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...