【发布时间】:2020-03-08 18:57:37
【问题描述】:
我有一个实例 BasicReference 和 TaggableReference 的列表,它们实现了一个通用接口 IReference
基本参考.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 添加到类型参数为对象的列表中。但是我如何让它们从 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);
}
}
}
}
}
【问题讨论】:
-
您希望
Test()方法如何被调用?知道这可能有助于理解如何构建代码 -
我希望 Test 返回从 Basic Reference 或 TaggableReference 返回的类型。基本上我需要能够说它是一个字符串或字符串的元组。
-
IReference<(string,string)>和IReference<string>完全不一样,所以需要先检查一下:if (obj is IReference<string> iRefStr) iRefStr.Valid("test");