请检查以下代码部分(简化版)
我担心的是ReadPath
类,我需要调用我正在使用的类型的GetPath()。我怎样才能做到这一点?
public interface IPath
{
string GetPath();
}
public class classA: IPath
{
string GetPath()
{
return "C:\";
}
}
public class classB: IPath
{
string GetPath()
{
return "D:\";
}
}
public class ReadPath<T> where T : IPath
{
public List<T> ReadType()
{
// How to call GetPath() associated with the context type.
}
}
答案 0 :(得分:5)
public interface IPath
{
string GetPath();
}
public class classA : IPath
{
public string GetPath()
{
return @"C:\";
}
}
public class classB : IPath
{
public string GetPath()
{
return @"D:\";
}
}
public class ReadPath<T> where T : IPath, new()
{
private IPath iPath;
public List<T> ReadType()
{
iPath = new T();
iPath.GetPath();
//return some list of type T
}
}
答案 1 :(得分:3)
接口基于实例。因此,如果您想这样做,请传入一个实例并使用它。
但是,有一个基于类型的概念:属性:
[TypePath(@"C:\")]
public class classA
{
}
[TypePath(@"D:\")]
public class classB
{
}
public class ReadPath<T>
{
public static List<T> ReadType()
{
var attrib = (TypePathAttribute)Attribute.GetCustomAttribute(
typeof(T), typeof(TypePathAttribute));
var path = attrib.Path;
...
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct
| AttributeTargets.Interface | AttributeTargets.Enum,
AllowMultiple = false, Inherited = false)]
public class TypePathAttribute : Attribute
{
public string Path { get; private set; }
public TypePathAttribute(string path) { Path = path; }
}
答案 2 :(得分:2)
另一个解决方案是实例成员,但是 应该更改泛型声明:
public class ReadPath<T> where T : IPath, new() //default ctor presence
{
T mem = new T();
public string ReadType()
{
return mem.GetPath();
}
}
并非我更改了返回的类型,因为不清楚如何使用string
List<T>
答案 3 :(得分:0)
您在.net / c#编程的几个不同方面之间感到困惑。
静态方法(你甚至没有这里)不能通过接口定义,所以如果你对使用静态方法感兴趣,那么接口wotn可以帮助你,你只能通过反射以通用的方式执行这样的方法。 / p>
您的代码不清楚,很难理解为什么您的readtype方法返回一个列表,以及您应该如何填写此列表。