如何将静态字符串与对象类型C#相关联

时间:2015-03-05 11:56:05

标签: c# .net generics

我有一个查询其余 API 的方法,我在其中执行从 JSON 到对象的映射。由于我传递给此方法的查询字符串和对象类型始终必须匹配,因此我希望将查询字符串包含为静态字符串。

public class Root
{
    public static string Query;
}

public class RootObject : Root, IRootObject
{
    public D d { get; set; }
    public static new string Query = "AccountSet";
}

public interface IRootObject
{
    D d  { get; }
}

public class RestClass
{
     public void Connect<T>() where T : Root, IRootObject
     {    
        T.Query  <-- fails (not actual code. Just to show my problem)
     }  
}

2 个答案:

答案 0 :(得分:4)

您可以使用自定义属性:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class QueryAttribute : Attribute
{
    public string QueryString { get; private set; }

    public QueryAttribute(string queryString)
    {
        QueryString = queryString;
    }

    public static string GetQueryStringForType(Type type)
    {
        var queryAttr = type.GetCustomAttributes(typeof(QueryAttribute), false)
                            .FirstOrDefault() as QueryAttribute;

        return queryAttr != null ? queryAttr.QueryString : null;
    }
}

在课堂上使用它:

[Query("AccountSet")]
public class RootObject : Root, IRootObject
{
    public D d { get; set; }
}

并检索这样的值:

public void Connect<T>() where T : Root, IRootObject
{
    var query = QueryAttribute.GetQueryStringForType(typeof(T));
}

答案 1 :(得分:1)

Delphi等语言相反,C#和.NET CLI通常不支持静态多态的概念。

因此,您需要一些其他方法将类型特定信息附加到您的类型中,我建议其中两个:

  1. 您可以使用custom attribute标记您的课程。可以使用GetCustomAttributes等反射方法从typeof(T)检索该属性。一旦定义了属性类,就可以很容易地为要传递给T的每种类型声明这些属性。缺点是没有办法编译时检查传递给T的每个类是否都被这样的属性装饰。
  2. 或者,您可以选择“信息对象”。创建一个基类ObjectInfo<T>,作为T 类型实例的工厂,作为T上某些元信息的存储,例如您的{{ 1}}字符串。对于要传递给Query的每种类型,为T类创建子类(例如,创建一个覆盖ObjectInfo<T> where T : Root RootObjectInfo : ObjectInfo<RootObject>属性的类Query以返回适当的字符串)。然后,修改ObjectInfo<T>,因此需要Connect<T>作为参数。