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

本文关键字:实现 目标 何实现 静态 | 更新日期: 2023-09-27 18:34:57

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

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

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

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
    }
}

接口是基于实例的。因此,如果您想这样做,请传入一个实例并使用它。

但是,有一个基于类型的概念:属性:

[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; }
}

另一种解决方案是实例成员,但您应该稍微更改泛型声明:

public class ReadPath<T> where T : IPath, new() //default ctor presence
{       
    T mem = new T();
    public string  ReadType()
    {
        return mem.GetPath();
    }        
}

并不是说我更改了返回类型,因为不清楚您将如何将返回类型stringList<T>

您在 .net/c# 编程的几个不同方面之间混淆了。
静态方法(这里甚至没有(不能通过接口定义,所以如果你有兴趣使用静态方法,接口 wotn 可以帮助你,你可以通过反射以通用的方式执行这种方法。

你的

代码有点不清楚,很难理解为什么你的readtype方法返回一个列表,以及你应该如何填写这个列表。