我正在開發 .NET 6.0 應用程式。我有generic dictionary作為引數的類
Dictionary<string, TPolicyDictionary> dataPolicyDictionary
在哪里TPolicyDictionary上課。現在這個類有我需要訪問但無法識別的屬性,因為我期望屬性定義在運行時決議,即是我試圖傳遞泛型方法IsRequire的類的屬性之一。DataReadingRule
public class DataReadingRule
{
public Guid DataReadingRuleId { get; set; }
public bool IsRequire { get; set; }
}
generic class
public class IsRequiredPolicy : BaseConversionValidator, IIsRequiredPolicy
{
public IsRequiredPolicy() { }
public string Text { get; set; }
public string FieldName { get; set; }
public override Task<dynamic> Validate<TPolicyDictionary>(Dictionary<string, TPolicyDictionary> dataPolicyDictionary)
{
try
{
bool isRecordExist = false;
bool isRequired = false;
bool isRecordValid = false;
if (!string.IsNullOrWhiteSpace(FieldName))
{
var policy = dataPolicyDictionary.Where(_ => _.Key == FieldName).Select(x => x.Value).FirstOrDefault();
if (policy.IsRequire) //IsRequire doesn't recognise here
{
isRequired = true;
}
error

uj5u.com熱心網友回復:
該屬性不可訪問,因為可以傳遞任何型別的實體。
在您的情況下,您知道您傳遞了實體,DataReadingRule但也可以傳遞object型別的實體并且它沒有IsRequire屬性 - 在這種情況下編譯器應該怎么做?
如果您總是知道該型別DataReadingRule被傳遞給Validate()方法,那么您不需要此方法是通用方法(如果您可以更改基類中的簽名):
public override Task<dynamic> Validate(Dictionary<string, DataReadingRule> dataPolicyDictionary) { // ...}
或者您可以使用約束(如果您可以更改基類中的簽名):
public override Task<dynamic> Validate<TPolicyDictionary>(Dictionary<string, TPolicyDictionary> dataPolicyDictionary) where TPolicyDictionary : DataReadingRule { // ...}
如果您無法更改基類中的簽名,則應檢查policyand cast 的型別:
public override Task<dynamic> Validate<TPolicyDictionary>(Dictionary<string, TPolicyDictionary> dataPolicyDictionary)
{
try
{
bool isRecordExist = false;
bool isRequired = false;
bool isRecordValid = false;
if (!string.IsNullOrWhiteSpace(FieldName))
{
var policy = dataPolicyDictionary.Where(_ => _.Key == FieldName).Select(x => x.Value).FirstOrDefault();
if (policy is DataReadingRule dataReadingRule)
{
// property is now accessible
if (dataReadingRule.IsRequire)
{
isRequired = true;
}
// ...
}
else
{
// policy is not DataReadingRule
}
}
// ...
}
}
或者,如果您可以創建介面:
public interface IRule
{
public bool IsRequire { get; } // add setter if needed
}
然后實作它:
public class DataReadingRule : IRule
{
public Guid DataReadingRuleId { get; set; }
public bool IsRequire { get; set; }
}
然后添加約束(在基類中),您的方法將是:
public override Task<dynamic> Validate<TPolicyDictionary>(Dictionary<string, TPolicyDictionary> dataPolicyDictionary)
where TPolicyDictionary : IRule // constraint
{
// your code without changes
}
uj5u.com熱心網友回復:
繼續@Roman 的建議
將公共屬性放在基類中并從中擴展類
public class BaseDataRule
{
public bool IsRequire { get; set; }
}
在抽象類
public abstract ValidationStatus Validate<TPolicyDictionary>(Dictionary<string, TPolicyDictionary> dataPolicyDictionary) where TPolicyDictionary : BaseDataRule;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494536.html
上一篇:從可選建構式引數推斷的類屬性
