我有一個public Dictionary<string, PostRenewalActionJobs> Jobs存盤一些我想為特定帳戶觸發的操作,這本字典的鍵是帳戶名。
public class PostRenewalActionJobs
{
public List<AlterDatabaseLinkJob> AlterDataBaseLink { get; set; }
public DatabaseConnectionCheckJob DatabaseConnectionCheck { get; set; }
public UnlockDatabaseAccountJob UnlockDatabaseAccount { get; set; }
public LinuxConnectionCheckJob LinuxConnectionCheck { get; set; }
public WindowsConnectionCheckJob WindowsConnectionCheck { get; set; }
public ReplacePasswordInFileJob ReplacePasswordInFile { get; set; }
}
可以通過在字典中使用as 鍵為特定帳戶或所有帳戶定義PostRenewalActionJobs型別 ( AlterDataBaseLink, DatabaseConnectionCheck, 等)的屬性*:
通過使用以下方法,我可以檢索帳戶(如果存在)或一般作業的作業:
public PostRenewalActionJobs GetJobsForAccount(string accountName)
{
return Jobs.ContainsKey(accountName) ? Jobs[accountName] : Jobs["*"];
}
如果來自特定帳戶的物件為空,我想要一種從所有帳戶物件(“*”)中獲取作業的動態方式。
類似于下面的內容,但不會為所有作業型別重復相同的代碼,并且是在引入新作業型別時應該起作用的解決方案。
var dbConCheckJob = GetJobsForAccount("someAccount").AlterDataBaseLink;
if(dbConCheckJob == null || !dbConCheckJob.Any())
{
dbConCheckJob = GetJobsForAccount("*").AlterDataBaseLink
}
我想使用一些反射,但我不知道如何去做。
uj5u.com熱心網友回復:
您不需要使用反射。您已經可以確定是獲取帳戶的特定作業還是通用作業,然后您可以使用 aFunc來獲取您想要的作業:
public TJob GetPostJobForAccount<TJob>(string accountName,
Func<PostRenewalActionJobs, TJob> jobSelector) where TJob : JobBase
{
var genericJobs = Jobs["*"];
var accountJobs = Jobs.ContainsKey(accountName) ? Jobs[accountName] : genericJobs;
// Account might be defined but without any job of the given type
// hence selecting from the defaults if need be
return jobSelector(accountJobs) ?? jobSelector(genericJobs);
}
var bobJob = GetPostJobForAccount("bob", x => x.WindowsConnectionCheck);
var aliceJob = GetPostJobForAccount("alice", x => x.UnlockDatabaseAccount);
uj5u.com熱心網友回復:
我找到了一種方法來做到這一點,不確定是否有更好的方法:
public TJob GetPostJobForAccount<TJob>(string accountName)
{
Type type = typeof(PostRenewalActionJobs);
var accountJobs = Jobs[accountName];
var generalJobs = Jobs["*"];
foreach (var item in type.GetProperties())
{
var itemType = item.PropertyType;
var currentType = typeof(TJob);
if (itemType != currentType)
{
continue;
}
var output = (TJob)accountJobs?.GetType()?.GetProperty(item.Name)?.GetValue(accountJobs, null);
if (output is null)
{
output = (TJob)accountJobs?.GetType()?.GetProperty(item.Name)?.GetValue(generalJobs, null);
}
return output;
}
return default;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/399945.html
上一篇:如何將IntPtr轉換為結構陣列
下一篇:基于事件的并行任務處理
