第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 C# 中將類型傳遞給函數(shù)

在 C# 中將類型傳遞給函數(shù)

C#
BIG陽 2023-12-17 10:12:31
我正在使用帶有實(shí)體框架核心的.net core 2.1。我的項(xiàng)目中定義了不同的模型/實(shí)體/類型。例如學(xué)生、班級(jí)、老師。我正在獲取這些模型的表數(shù)據(jù)以在我的緩存中設(shè)置。此刻,我正在做這件事;string[] tablesToBeCached  = { "Student", "Class", "Teacher" };foreach(var table in tablesToBeCached){     cache.Set(key, GetTableData(dbContext, table));}函數(shù)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;       }  }我希望這段代碼既聰明又簡(jiǎn)短。我嘗試遵循,但沒有成功; (錯(cuò)誤是“x”是一個(gè)變量,但像類型一樣使用)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貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊

正如有人在評(píng)論中指出的那樣,您應(yīng)該使用泛型:


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>();

}

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


例如,假設(shè)您的實(shí)體實(shí)現(xiàn)一個(gè)通用接口IEntity:


interface IEntity {}


class Student: IEntity {}


class Teacher: IEntity {}

然后你可以


1 檢索所有實(shí)現(xiàn)IEntity的類型:


var type = typeof(IEntity);

var types = AppDomain.CurrentDomain.GetAssemblies()

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

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

2.這樣調(diào)用GetTableData方法:


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


foreach (var entityType in types)

{

    MethodInfo genericMethod = method.MakeGenericMethod(entityType);

    genericMethod.Invoke(this, null);

}


查看完整回答
反對(duì) 回復(fù) 2023-12-17
?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

我的解決方案如下;


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>();

}


查看完整回答
反對(duì) 回復(fù) 2023-12-17
  • 2 回答
  • 0 關(guān)注
  • 219 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)