T4模板如何根据参数生成CS文件?

「已注销」 2015-06-10 04:43:09
T4模板如何根据参数生成CS文件?

例如我想生成如下代码的cs文件.请问该如何操作?

public string Fun(string Key)
{
return Get+Key();//说明根据传入的Key不同,调用的方法不同. 例如 Key="Name" 我就需要调用 GetName(); 这个方法
}

谢谢.
...全文
187 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2015-06-11
  • 打赏
  • 举报
回复
引用 7 楼 effun 的回复:
[quote=引用 5 楼 cfsoftcn 的回复:] [quote=引用 3 楼 effun 的回复:] 这样的话不需要反射,可以把这些Repository放到一个字典里,通过Key来访问。
这样不行的. 他们没有一个统一类型. 声明字典的时候. 后面value的类型不知道是什么. 因为_DbSession是继承的.ARepository是一个带类型的接口 ARepository: BaseRepository<xxxx> 这样写的. 所以我不知道他是啥类型.[/quote] 试试用dynamic,字典的值类型可以用object。 dynamic rep = _DbSession.Repositories[Key]; rep.LoadEntities(...);[/quote] 动态解决了类型问题. 但是不支持lambda表达式.
effun 2015-06-11
  • 打赏
  • 举报
回复
越想越觉得有问题,不知道为什么要这样做,能不能从设计上考虑一下这样合不合理,或者可以提供一些更多的你的想法,帮你一起想想。
effun 2015-06-11
  • 打赏
  • 举报
回复
确实有点麻烦,因为类型参数是不同的,不能直接写Lambda表达式,不过可以动态生成Lambda表达式。
effun 2015-06-10
  • 打赏
  • 举报
回复
引用 5 楼 cfsoftcn 的回复:
[quote=引用 3 楼 effun 的回复:] 这样的话不需要反射,可以把这些Repository放到一个字典里,通过Key来访问。
这样不行的. 他们没有一个统一类型. 声明字典的时候. 后面value的类型不知道是什么. 因为_DbSession是继承的.ARepository是一个带类型的接口 ARepository: BaseRepository<xxxx> 这样写的. 所以我不知道他是啥类型.[/quote] 试试用dynamic,字典的值类型可以用object。 dynamic rep = _DbSession.Repositories[Key]; rep.LoadEntities(...);
「已注销」 2015-06-10
  • 打赏
  • 举报
回复
引用 4 楼 wsh1992o 的回复:
貌似不行吧,反射好像可以
求教具体方法.
「已注销」 2015-06-10
  • 打赏
  • 举报
回复
引用 3 楼 effun 的回复:
这样的话不需要反射,可以把这些Repository放到一个字典里,通过Key来访问。
这样不行的. 他们没有一个统一类型. 声明字典的时候. 后面value的类型不知道是什么. 因为_DbSession是继承的.ARepository是一个带类型的接口 ARepository: BaseRepository<xxxx> 这样写的. 所以我不知道他是啥类型.
存钱买冰棍 2015-06-10
  • 打赏
  • 举报
回复
貌似不行吧,反射好像可以
effun 2015-06-10
  • 打赏
  • 举报
回复
这样的话不需要反射,可以把这些Repository放到一个字典里,通过Key来访问。
「已注销」 2015-06-10
  • 打赏
  • 举报
回复
引用 1 楼 effun 的回复:
你说的这个要用反射来实现,T4实现不了。 return this.GetType().GetMethod("Get" + Key).Invoke(this, null); T4能生成的是类似下面的代码 public string Name() { return GetName(); }
好吧.我现在的实际问题是这样的.

public void Fun(string Key)
{
var temp = _DbSession.Key+Repository.LoadEntities(s => s.fldUserGuid == mGuid).OrderBy(s => s.fldName).ToList();
//当Key="A"的时候需要调用的方法如下.
var temp = _DbSession.ARepository.LoadEntities(s => s.fldUserGuid == mGuid).OrderBy(s => s.fldName).ToList();
//当Key="B"的时候需要调用的方法如下.
var temp = _DbSession.BRepository.LoadEntities(s => s.fldUserGuid == mGuid).OrderBy(s => s.fldName).ToList();
}
请问这样的需求用反射怎么写?
effun 2015-06-10
  • 打赏
  • 举报
回复
你说的这个要用反射来实现,T4实现不了。 return this.GetType().GetMethod("Get" + Key).Invoke(this, null); T4能生成的是类似下面的代码 public string Name() { return GetName(); }

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧