我有一个查询其余 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)
}
}
答案 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通常不支持静态多态的概念。
因此,您需要一些其他方法将类型特定信息附加到您的类型中,我建议其中两个:
GetCustomAttributes
等反射方法从typeof(T)
检索该属性。一旦定义了属性类,就可以很容易地为要传递给T
的每种类型声明这些属性。缺点是没有办法编译时检查传递给T
的每个类是否都被这样的属性装饰。ObjectInfo<T>
,作为T
和类型实例的工厂,作为T
上某些元信息的存储,例如您的{{ 1}}字符串。对于要传递给Query
的每种类型,为T
类创建子类(例如,创建一个覆盖ObjectInfo<T> where T : Root
RootObjectInfo : ObjectInfo<RootObject>
属性的类Query
以返回适当的字符串)。然后,修改ObjectInfo<T>
,因此需要Connect<T>
作为参数。