我知道(在理论上)可以在运行时创建一个新类型,但是可以在运行时修改现有类型的方法体吗?我的计划(如果我可以让它工作)是使用自定义属性标记方法,然后在运行时搜索具有该属性的方法,并将我自己的一些代码插入到方法体中.
有什么建议?
我想如果我不能使用这种方法,我总是可以使用基类中的虚方法(带有属性),结合静态工厂使用我的运行时生成的方法吐出派生的动态类型在儿童班.尽管如此,这并不是那么干净.
是否有任何免费工具可帮助简化在.NET 3.5中使用NHibernate项目的工作?首先,我正在寻找某种代码和配置文件生成器来自动化使用NHibernate的一些更繁琐的部分.
是否有任何Codesmith的免费/开源替代品可以在功能上进行比较并生成.NET代码?
为了在C中定义可由Lua调用的方法,它必须匹配给定的签名并使用Lua API来检索参数并返回结果.我正在编写Lua的C#包装器,我对能够调用任意C#方法而不使它们遵循这些约定感兴趣.在包装类似D的东西时,可以使用模板系统为任何给定方法动态创建此粘合代码.我认为这在C#中可能也是可能的,但是通过使用动态代码生成.
C API看起来像这样,生成的代码将通过我的库的较低级别部分来操作它,该部分P/Invokes Lua C库.
static int foo (lua_State *L)
{
int n = lua_gettop(L); /* number of arguments */
lua_Number sum = 0;
int i;
for (i = 1; i <= n; i++)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "incorrect argument");
lua_error(L);
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum/n); /* first result */
lua_pushnumber(L, sum); /* second result */
return 2; /* number of results */
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我的想法是采用C#方法,反映其参数和返回值,生成(或从缓存中检索)一个方法,该方法使用上面的Lua API传递这些参数并返回这些返回类型,最后将该方法推送到Lua .因此,当从Lua调用C#函数时,它看起来像lua - > magic wrapper function - >普通的C#函数. …
我最近遇到了很多函数,其中gcc在x86上生成了非常糟糕的代码.他们都符合以下模式:
if (some_condition) {
/* do something really simple and return */
} else {
/* something complex that needs lots of registers */
}
Run Code Online (Sandbox Code Playgroud)
将简单的情况看作是一个非常小的东西,一半或更多的工作花在推动和弹出不会被修改的寄存器上.如果我手动编写asm,我会在复杂的情况下保存并恢复已保存的跨调用寄存器,并且在简单的情况下完全避免触及堆栈指针.
有没有什么方法可以让gcc变得更聪明并且自己做到这一点?最好使用命令行选项,而不是源代码中的丑陋黑客...
编辑:为了使它具体化,这里有一些非常接近我正在处理的一些函数:
if (buf->pos < buf->end) {
return *buf->pos++;
} else {
/* fill buffer */
}
Run Code Online (Sandbox Code Playgroud)
另一个:
if (!initialized) {
/* complex initialization procedure */
}
return &initialized_object;
Run Code Online (Sandbox Code Playgroud)
另一个:
if (mutex->type == SIMPLE) {
return atomic_swap(&mutex->lock, 1);
} else {
/* deal with ownership, etc. */
}
Run Code Online (Sandbox Code Playgroud)
编辑2:我应该首先提到:这些函数不能内联.他们有外部联系,他们是图书馆代码.允许它们在应用程序中内联将导致各种问题.
我希望有一个命令行工具从C或C++源文件中提取定义或声明(typedef,structure,enumeration,variable或function).另外一种替换现有定义/声明的方法也很方便(在用户提交的脚本转换提取的定义之后).是否有这样的通用工具,或者是这种工具的一些合理的近似值?
脚本性和与用户创建的脚本或程序连接的能力在这里很重要,尽管我在学术上也对GUI程序感到好奇.Unix/Linux阵营的开源解决方案是首选(尽管我对Windows和OS X工具也很好奇).主要的语言兴趣是C和C++,但更通用的解决方案会更好(我认为我们不需要超级准确的解析功能来查找,提取和替换程序源文件中的定义).
示例用例(额外 - 用于好奇心灵):
structs和这些类型的变量(数组)初始化,假设需要通过添加或重新排序字段或以更易读的格式重写变量/数组定义来更改结构定义,而不会引入手工劳动产生的错误.这可以通过提取旧的初始化,然后使用脚本/程序编写新的初始化来替换旧的初始化来实现.替代问题:如果有一个工具来告诉定义的位置(开始和结束行就足够了 - 我们甚至可以假设我们感兴趣的所有定义/声明都在他们自己的行中),那么它只是一个简单的练习手指灵巧地写一个程序
提取定义,运行由命令行选项(或编辑器)指定的程序
stdin(或从临时文件)接收所需的提取定义,stdout(或将它们保存到给定的临时文件)被执行程序取代.
因此,主要的,更具挑战性的问题是找到定义的开始和结束行.
备注标签:更准确的标签比code-generation会code-transformation,但它不存在.
c refactoring automation code-generation program-transformation
如何获取用户定义的表类型的列信息?
EXEC sp_columns TABLENAME
Run Code Online (Sandbox Code Playgroud)
让我回到表的所有列信息.
我想对一个名为SearchList的用户定义表类型做同样的事情,并返回大致相同的列信息.
我想得到这个,所以我可以编码生成我需要在c#中的数据表.
更新显示我使用的是什么
select c.name as COLUMN_NAME, t.name as [TYPE_NAME], c.precision as [PRECISION], c.is_nullable as [NULLABLE], c.system_type_id, c.precision as [LENGTH]
from sys.columns c, sys.types t
where c.object_id = (select type_table_object_id from sys.table_types where name = 'SearchList')
and t.user_type_id = c.user_type_id
order by c.column_id
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring和开发一个java web项目Mybatis.
在dao级别,我定义了一个超级类和一个超级接口,它实现了所有常用方法.
因此,当在dao级别为特定模型创建子类或接口时,我只需要实现super dao类和接口,并将类体和接口体留空.超过一半的子dao级别类和接口一直是空的.
(空dao类和接口的示例:)
RoleDao.java
package core.dao;
import core.dao.base.BaseDao;
import core.model.Role;
public interface RoleDao extends BaseDao<Role> {
}
Run Code Online (Sandbox Code Playgroud)
RoleDaoImpl.java
package core.dao.impl;
import org.springframework.stereotype.Repository;
import core.dao.RoleDao;
import core.dao.base.BaseDaoImpl;
import core.model.Role;
@Repository
public class RoleDaoImpl extends BaseDaoImpl<Role> implements RoleDao {
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否有一种避免编写这些空类和接口的好方法,同时仍然可以使用它们?
我正在考虑使用Code generator生成这些类文件,或者Java reflection根据需要在运行时创建这样的类和接口,但还没有详细说明.
@ 更新
在没有创建源代码的情况下实现目标似乎不灵活,所以我决定为java web项目编写一些简单的java源代码生成器.
一个叫做的工具codemodel非常适合这样做,它由Sun开发,现在由Oracle拥有,我猜.
并且,我自己给出了我编写的用于生成java源代码的代码的答案.
我有源代码(大部分的存储库*.php,*.js)和文档文件(主要是*.md,*.html,*.svg)自动从注释生成.所有文档都位于./doc存储库中的单独子目录()中.
一方面,我希望通过跟踪文档,git如果它发生变化,我希望它被提交/推送到服务器,因为它有一个很好的可浏览和最新文档很不方便由github显示.
另一方面,在输出git diff命令期间看到自动生成的文件是非常烦人的.例如,如果在两次提交之间更改了一行源代码,则git diff不仅会输出此单行,而且还会输出所有自动生成的文档,因为整个自动生成的文档已更改.
有没有办法告诉git跟踪文档但diff默认情况下将其排除?如果git将所有文档文件视为blob,我也会对我好.然后,至少diff只会声称文件已更改,但不会显示所有文档行每行.
最近我使用了相当多的代码生成,通常与部分类相结合.基本上设置如下:
问题是当我使用像"生成方法"这样的Intellisense功能时,它们由于某种原因在包含生成代码的文件中生成.显然我不希望这样.
我的问题是:是否有可能生成一些提示告诉Intellisense它不应该触摸某些'cs'文件(而是其他部分类)?
更新
回想起来,我应该注意到我正在使用自定义工具来生成代码.它不是EF或简单的转换; 代码生成中涉及到相当多的逻辑.此外,它还使用部分类生成完整的命名空间和类结构.通过从csproj文件中提取"root命名空间" 然后使用文件夹结构来确定绝对命名空间(它与Linq2sql的工作方式类似).
xanatos(谢谢!)建议的答案有效:intellisense对名称进行操作排序,然后按字母顺序对名称进行排序,然后选择列表中的第一项.这意味着您可以生成一个zzzz.foo.cs(虽然有点难看)将正常工作.我刚刚进行了一些实验,发现该功能find all references返回了VS似乎使用的顺序.事实证明,它的工作原理如下:
假设您有一个自定义工具,可以处理文件名foo.bar并将其转换为foo.cs.自定义工具将生成内容作为字符串并将其传递回Visual studio(这就是自定义工具的工作方式......).结果将在一个名为的文件中foo.cs.
现在,我很惊讶地发现Intellisense不会将其排序为foo.cs而是将其排序为foo.bar\foo.cs.换句话说:无论你如何命名您的自定义工具"CS"的输出,你必须到基本文件重命名foo.bar为类似zoo.bar.
虽然这可能是一种解决方法,但我很愿意接受它作为答案,因为我必须给我的项目中的文件奇怪的名字(名字有意义......).此外,我的一些自定义工具依赖于他们的文件名,因此也会被破坏...
因此,我仍然愿意就如何正确解决这个问题提出建议.
code-generation ×10
.net ×4
c ×2
c# ×2
reflection ×2
.net-3.5 ×1
automation ×1
codesmith ×1
gcc ×1
git ×1
gitignore ×1
inheritance ×1
intellisense ×1
java ×1
lua ×1
mybatis ×1
nhibernate ×1
refactoring ×1
spring ×1
sql-server ×1
types ×1
x86 ×1