C# 将列表中的实例强制转换为其通用接口

C# 将列表中的实例强制转换为其通用接口,c#,oop,generics,interface,C#,Oop,Generics,Interface,我有一个实例列表BasicReference和TagGablerReference,它们实现了一个通用接口IReference 基本参考 namespace DefaultNamespace { public class BasicReference : IReference<string> { public string Resolve(string name) { return name; }

我有一个实例列表BasicReference和TagGablerReference,它们实现了一个通用接口IReference

基本参考

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

        public bool Valid(string name)
        {
            return (name != null);
        }
    }
}
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);
        }
    }
}
namespace DefaultNamespace
{
    public interface IReference<out T>
    {
        T Resolve(string name);
        bool Valid(string name);
    }
}
namespace-DefaultNamespace
{
公共类基本引用:i引用
{
公共字符串解析(字符串名称)
{
返回名称;
}
公共bool有效(字符串名称)
{
返回(name!=null);
}
}
}
TaggableReference.cs

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

        public bool Valid(string name)
        {
            return (name != null);
        }
    }
}
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);
        }
    }
}
namespace DefaultNamespace
{
    public interface IReference<out T>
    {
        T Resolve(string name);
        bool Valid(string name);
    }
}
namespace-DefaultNamespace
{
公共类标记参考:i参考
{
公共(字符串,字符串)解析(字符串名称)
{
报税表(姓名+“1”,姓名+“2”);
}
公共bool有效(字符串名称)
{
返回(name!=null);
}
}
}
IReference.cs

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

        public bool Valid(string name)
        {
            return (name != null);
        }
    }
}
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);
        }
    }
}
namespace DefaultNamespace
{
    public interface IReference<out T>
    {
        T Resolve(string name);
        bool Valid(string name);
    }
}
namespace-DefaultNamespace
{
公共接口i引用
{
T解析(字符串名);
bool-Valid(字符串名称);
}
}
我可以将BasicReference和TagGablerReference添加到类型参数为object的列表中。但是我如何将它们转换为从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);    
                } 
            }
        }
    }
}
使用System.Collections.Generic;
命名空间DefaultNamespace
{
公开课考试
{
私有列表引用=新列表();
公共???测试()
{
添加(新的BasicReference());
Add(新标记gablerreference());
字符串引用example=“example”;
foreach(引用中的var引用)
{
//我如何强制转换它,以便调用IReference方法并返回类型
//我从方法返回什么类型?
if(reference.Valid(referenceExample))
{
??结果=参考。解析(参考示例);
} 
}
}
}
}

只要在调用
Test()
方法时知道所需的类型,就可以将该方法设置为泛型,并返回给定类型的引用:

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
}
publictest()
{
Add(新标记gablerreference());
添加(新的BasicReference());
字符串引用example=“example”;
foreach(references.OfType()中的var引用)
{
if(reference.Valid(referenceExample))
{
返回reference.Resolve(referenceExample);
}
}
返回默认值;//未找到相应的句柄类型
}
这种方法的用途是:

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

var taggableReference = test.Test<(string, string)>();
Console.WriteLine(taggableReference);
var reference=test.test();
控制台写入线(参考);
var taggableReference=test.test();
Console.WriteLine(taggablerreference);
产生预期输出的:


您希望如何调用
Test()
方法?了解这一点可能有助于理解如何构造代码,我希望测试返回从基本引用或taggablerreference返回的类型。基本上我需要能够说它是一个字符串或字符串的元组。
I引用
I引用
完全不同,所以你需要先检查它:
如果(obj是I引用iRefStr)iRefStr.Valid(“test”)