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

Son*_*ken 5 .net c# generics

我有一个查询rest 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)
     }  
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ski 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的课程中使用它:

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

并像这样检索值:

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