亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 C# 中將類型傳遞給函數

在 C# 中將類型傳遞給函數

C#
BIG陽 2023-12-17 10:12:31
我正在使用帶有實體框架核心的.net core 2.1。我的項目中定義了不同的模型/實體/類型。例如學生、班級、老師。我正在獲取這些模型的表數據以在我的緩存中設置。此刻,我正在做這件事;string[] tablesToBeCached  = { "Student", "Class", "Teacher" };foreach(var table in tablesToBeCached){     cache.Set(key, GetTableData(dbContext, table));}函數GetTableData()定義如下;public IEnumerable<object> GetTableData(DBContext dbContext, string tableName){      switch (tableName)      {          case "Student":              return dbContext.Student;          case "Class":              return dbContext.Class;          case "Teacher":              return dbContext.Teacher;          default:              return null;       }  }我希望這段代碼既聰明又簡短。我嘗試遵循,但沒有成功; (錯誤是“x”是一個變量,但像類型一樣使用)List<object> entities = new List<object> { typeof(Student), typeof(Class), typeof(Teacher) };entities.ForEach(x => GetTableData(x, dbContext));public IEnumerable<object> GetTableData(object x, DBContext dbContext){     return dbContext.Set<x>();}有人可以幫忙嗎?在 C# 中也可能嗎?
查看完整描述

2 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

正如有人在評論中指出的那樣,您應該使用泛型:


cache.Set(key1, GetTableData<Student>(dbContext));

cache.Set(key2, GetTableData<Class>(dbContext));

cache.Set(key3, GetTableData<Teacher>(dbContext));



public static IEnumerable<T> GetTableData<T> (DBContext dbContext)

{

     return dbContext.Set<T>();

}

為了避免為每個實體編寫相同的代碼 (cache.Set),您可以使用反射,但您的實體應該實現某種通用接口或基類。


例如,假設您的實體實現一個通用接口IEntity:


interface IEntity {}


class Student: IEntity {}


class Teacher: IEntity {}

然后你可以


1 檢索所有實現IEntity的類型:


var type = typeof(IEntity);

var types = AppDomain.CurrentDomain.GetAssemblies()

    .SelectMany(s => s.GetTypes())

    .Where(p => type.IsAssignableFrom(p));

2.這樣調用GetTableData方法:


MethodInfo method = GetType.GetMethod("GetTableData ");


foreach (var entityType in types)

{

    MethodInfo genericMethod = method.MakeGenericMethod(entityType);

    genericMethod.Invoke(this, null);

}


查看完整回答
反對 回復 2023-12-17
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

我的解決方案如下;


MethodInfo methodInfo = typeof(CacheSettings).GetMethod("GetTableData");

string[] tablesToBeCached  = { "Student", "Class", "Teacher" };

object[] parameters = new object[] { myDBContextObj };


foreach(var tblToBeCached in tablesToBeCached)

{

    string key = $"{tblToBeCached}";

    MethodInfo getTableDataMethod = methodInfo.MakeGenericMethod(Type.GetType($"Namespace.{tblToBeCached}, AssemblyName"));

    cache.Set(key, getTableDataMethod.Invoke(null, parameters));

}


and the GetTableData() method is just one liner (Happy days ??)


public static IEnumerable<T> GetTableData<T>(MyDBContext dbContext) where T : class

{

   return dbContext.Set<T>();

}


查看完整回答
反對 回復 2023-12-17
  • 2 回答
  • 0 關注
  • 200 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號