通用中没有静态。但是如何实现这一目标呢?

时间:2012-05-22 07:14:29

标签: c# .net oop

请检查以下代码部分(简化版)

我担心的是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.
    }        
}

4 个答案:

答案 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方法返回一个列表,以及您应该如何填写此列表。