[英]Type safe equivalent of constraining a type parameter of a generic method to an unclosed type of given interface
在C#中,是否可以約束通用方法的類型參數,以便以類型安全的方式將其限制為接口的未封閉類型? 讓我詳細說明...
例如,我有以下偽代碼:
public bool Validate<TValidator>(object validatable)
where TValidator : IValidator<>
{
// code that finds all implementations of IValidator that closes on
// recursive base types / interfaces of the validatable object
// return true if validates
}
我有幾個實現IValidator的接口,例如ICreateValidator和IDeleteValidator。 我可以輕松地收集我想要的驗證器,而這種反射器不像我希望的那樣通用,可以關閉所有類型T,T的所有基類以及T實現的接口。
欲望將能夠按照
var validates = Validate<IDeleteValidator<>>(concreteDomainObject);
這將為我提供IDeleteValidator <>的未封閉類型,使我可以在內部找到IDeleteValidaor的每個實現,其中T是concreteDomainObject類型,concreteDomainObject類型實現的接口或遞歸基礎類型ConcreteDomainObject類型一直擴展到對象。
當然,我可以關閉域對象上的接口,這對我來說沒有必要調用
Type unclosedValidatorType = typeof (TValidator).GetGenericTypeDefinition()
鑒於我倆都不能保證TValidator在編譯時將是泛型類型,並且除非將其剝離為關閉類型,否則將不使用顯式關閉的TValidator,這對我來說似乎是錯誤的處理方式。
我提供的偽代碼顯然可以起作用,但是是否有一種類型安全的等效於將通用方法的類型構造為給定接口的未封閉類型的constrian?
編輯以更正某些術語
在C#中,是否可以限制通用方法的類型,以便以類型安全的方式將其限制為接口的非封閉類型?
不能。類型參數必須關閉,因此將類型參數約束為不能表示為類型參數的類型是沒有意義的。
忘記約束部分開始的地方-這個簡單的代碼將不起作用:
using System;
class Test
{
static void Main()
{
Foo<Action<>>();
}
static void Foo<T>()
{
Console.WriteLine(typeof(T));
}
}
錯誤:
Test.cs(7,20): error CS1525: Invalid expression term '>'
Test.cs(7,23): error CS1525: Invalid expression term ')'
Test.cs(7,24): error CS1026: ) expected
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.