通過反射獲取實現同一接口的所有類


 

業務場景是訂單支付完成之后需要把訂單信息到給倉庫系統,讓倉庫發貨;導出去之前需要檢查訂單的各種信息是否正確;

一開始做的是檢查6個內容,基本都是if-else這種邏輯實現,但是后來發現需要新增檢查邏輯的時候就很麻煩,而且代碼越寫越長;

現在想到一種實現方法,每種檢查邏輯單獨實現一個類,每個類共同實現一個接口;

邏輯一開始的時候通過反射找到所有實現該接口的類,循環調用每個類的實現;

這樣一來就可以每次新增校驗邏輯的時候,原來的類不用動,只需要增加一個新類,並且實現接口就可以。

 

var assemblies = new List<Assembly>() { typeof(OEAppHost).Assembly };
var types = assemblies.SelectMany(x => x.GetTypes())
.Where(x => (x.GetInterfaces().Contains(typeof(ICheckOrder))))
.ToArray();

var checkOrderInstances = types.Select(x=>Activator.CreateInstance(x)).ToList();


void RunNeedCheckProcess(object instance)
{
try
{
if (instance is ICheckOrder checkOrder)
checkOrder.Execute();
}
catch (Exception)
{
}
}

checkOrderInstances.ForEach(RunNeedCheckProcess);

 

static class ReflectExtension
{
public static bool HasInterface(this Type type, Type interfaceType)
{
foreach (var t in type.GetInterfaces())
{
if (t == interfaceType)
return true;
}
return false;
}
}

 

public interface ICheckOrder
{
void Execute();
}

public class CheckOrderName : ICheckOrder
{
public void Execute()
{
//throw new NotImplementedException();
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM