.NET 7 最近IParsable作為介面引入,我想檢查它是否存在。true如果T實作則回傳一些測驗,否則IParsable<T>回傳false。
假設我想回傳一個具有方法的型別T的物件,例如:TParse
T ParseAs<T>(string s)
{
if (typeof(IParsable<T>).IsAssignableFrom(typeof(T)))
{
return T.Parse(s);
}
else
{
//do something else...
}
}
我希望這能檢查是否T實作并IParsable<T>授予我訪問內部方法的權限。我似乎無法將用作 的型別引數,而是收到此例外:ParseTryParseTIParsable
CS0314
型別“T”不能用作TSelf泛型型別或方法“ ”中的型別引數“IParsable<TSelf>”。沒有從 'T' 到 'System.IParsable<T>' 的裝箱轉換或型別引數轉換
如果我嘗試使用,我也會收到上述錯誤is:
s is IParsable<T>
我將如何解決這個問題?
uj5u.com熱心網友回復:
為了能夠使用T.Parse()語法——您需要在編譯時知道T實作IParseable<T>. 您可以在編譯時確定這一點的唯一方法是明確地說:
T ParseAs<T>(string s) where T: IParsable<T> {
return T.Parse(s, null);
}
如果您只是鍵入T而沒有明確說明它是IParsable<T>- 不可能使用T.Parse語法,您應該一直使用反射。那是首先檢查是否T通過反射實作該介面,然后再次使用反射呼叫該靜態方法:
T ParseAs<T>(string s) {
var isParsable = typeof(T).GetInterfaces().Any(c => c.IsGenericType && c.GetGenericTypeDefinition() == typeof(IParsable<>));
if (isParsable) {
var parse = typeof(T).GetMethods(BindingFlags.Static | BindingFlags.Public)
.FirstOrDefault(c => c.Name == "Parse" && c.GetParameters().Length == 2 && c.GetParameters()[0].ParameterType == typeof(string) && c.GetParameters()[1].ParameterType == typeof(IFormatProvider));
if (parse != null)
return (T) parse.Invoke(null, new object[] { s, null });
}
return default(T);
}
這當然很難看,您可能不想這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537056.html
上一篇:依賴于可選特征界限的默認泛型引數
下一篇:Dart泛型方法無法識別型別
