我正在为类构造函数编写一些代码,它循环遍历类的所有属性,并调用一个通用的静态方法,该方法使用外部API中的数据填充我的类.所以我把它作为一个示例类:
public class MyClass{
public string Property1 { get; set; }
public int Property2 { get; set; }
public bool Property3 { get; set; }
public static T DoStuff<T>(string name){
// get the data for the property from the external API
// or if there's a problem return 'default(T)'
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我的构造函数中我想要这样的东西:
public MyClass(){
var properties = this.GetType().GetProperties();
foreach(PropertyInfo p in properties){
p.SetValue(this, DoStuff(p.Name), new object[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
所以上面的构造函数会抛出一个错误,因为我没有提供泛型类型.
那么如何传入属性的类型呢?
我正在制作一个位于ASP.Net WebAPI之上的SPA.我正在等待使用HTML5历史记录而不是#/历史路由,但是这会给深度链接带来问题,我需要确保/并且/foo/bar都返回相同的HTML文件(我的JS将呈现SPA的正确部分).
如何让OWIN/Katana为多个不同的网址返回相同的HTML文件?
我有一个WebAPI动作,如下所示:
[Route("api/values/{id}")]
public async Task<HttpResponseMessage> Delete(string id, DateTimeOffset date) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
但是当我从一个HttpClient实例调用它时,创建一个如下的URL:
string.Format("http://localhost:1234/api/values/1?date={0}", System.Net.WebUtility.UrlEncode(DateTimeOffset.Now.ToString()));
// -> "http://localhost:1234/api/values/1?date=17%2F02%2F2015+7%3A18%3A39+AM+%2B11%3A00"
Run Code Online (Sandbox Code Playgroud)
我得到一个400回复,说date不可存在的参数不存在.
我也尝试将该[FromUri]属性添加到参数中,但它仍然没有映射.如果我将其更改为DateTimeOffset?我可以看到它保留为null并且查看Request.RequestUri.Query值是否存在,只是没有映射.
最后,我尝试不做一个WebUtility.UrlEncode,它没有任何不同.
我试图找到一种方法来伪造从另一个方法中调用的方法的结果.
我有一个"LoadData"方法,它调用一个单独的帮助器来获取一些数据然后它将转换它(我有兴趣测试转换后的结果).
所以我有这样的代码:
public class MyClass(){
public void LoadData(){
SomeProperty = Helper.GetSomeData();
}
public object SomeProperty {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想从Helper.GetSomeData()方法获得已知结果.我可以使用一个模拟框架(我对Rhino Mocks的经验相当有限,但我愿意接受任何事情)来强制实现预期的结果吗?如果是这样,怎么样?
*编辑 - 是的,如我所料,我无法实现我想要的黑客攻击,我将不得不找到一种更好的方法来设置数据.
我们正在尝试使用(几乎)所有新开发工作中使用的Model-View-Presenter模式.
我坚信有一个框架可以帮助人们满足设计要求,我们有一些内部框架可以用于各种不同的组件(日志记录,电子邮件发送等),所以我试图获得某种MVP框架开发.
我已经设法将一些易于使用的东西放在那些不熟悉MVP并且与我们目前的工作方式相差不远的人身上.问题在于它正在与1个演示者建立1个视图的关系.
这是框架的大致轮廓:
public abstract class Presenter<TView> where TView : IView {
public virtual T View { get; set; }
public virtual void Setup(TView view) {
this.View = view;
}
}
public interface IView { }
Run Code Online (Sandbox Code Playgroud)
它的基本工作方式是创建的任何View都继承自IView接口,并传递给继承自抽象类的PresenterPresenter类.
正如您所看到的,我正在使用.NET泛型,以便开发人员在处理演示者时可以强大地键入View(最后是从演示者继承的类).
所以我可以像这样设置一个基本的登录组件:
public class Login : Presenter<ILogin> {
public override Setup(ILogin view){
base.Setup(view);
this.View.Login += new EventHandler(login);
}
void login(object sender, EventArgs e) { ... }
}
public interface ILogin : IView { …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个MSBuild文件,它将调用另一个MSBuild文件,我想知道实现这个目标的最佳方法是什么.
我们在构建服务器下载MSBuild文件的场景中使用它,然后根据参数执行相应的第二个文件.
我知道我可以使用这个<Exec Command="msbuild.exe ..." />任务,但这似乎是一种做得起来的hacky方式.
有没有更简单的方法来使用MSBuild执行另一个MSBuild文件?
我正在开发一个页面,它是一个ASP.NET MVC3应用程序的服务器,我想在其中使用KnockoutJS.
在View上我已经传递了一个填充的模型(我正在转换为KnockoutJS viewModel),我想构建一些DOM服务器端.这似乎是合乎逻辑的,因为我已经有了生成初始HTML的对象,它将为用户提供更好的体验,因为页面加载和DOM填充之间不会有延迟(这也意味着我有非基本功能) -JavaScript客户端).
做了一些研究后,我假设我需要创建一个自定义,bindingHandler所以我创建了这个:
ko.bindingHandlers.serverForEach = {
init: function() { /* no-op */ },
update: function() {
//call off to the built in loop handler
}
};
Run Code Online (Sandbox Code Playgroud)
所以我的想法是我创建了一个处理程序,它在init阶段中没有做任何事情(因为已经填充了DOM),并且在update阶段I中我只是插入新值.我想利用内置的模板,这也是一个通用的解决方案.
问题是在这种情况下一切都崩溃了.如果init什么都不做,则update失败,因为作为最后一个参数进入的bindingContext似乎是错误的,如果我包含init它将破坏现有的HTML.
任何人都试过这个/知道我应该做些什么来支持这种情况,或者它与你能做什么/应该做的太远了?
此外,我不希望为服务器生成的HTML提供单独的DOM元素而不是Knockout HTML.
我正在尝试建立一个公共日志库,它ILog根据当前堆栈确定实例,以及使用ILog的最佳实例.
我的配置设置如下:
<log4net>
<!-- appenders omitted -->
<root></root>
<logger name="MyAssembly.MyNamespace">
<level value="WARN" />
<!-- appender list -->
</logger>
</log4net>
Run Code Online (Sandbox Code Playgroud)
我有一个这样的课:
namespace MyAssembly.MyNamespace.SubNamespace {
public class MyClass { ... }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试获取ILog我传入type(var log = LogManager.GetLogger(typeof(MyClass)).Namespace);)的实例时,我希望它检测到没有配置任何记录器,因此它将在命名空间树(to MyAssembly.MyNamespace)中上升一级,然后查看是否在那一点配置.
问题是ILog返回的for MyAssembly.MyNamespace.SubNamespace配置为WARN事件(及以上),基本上是我为它的父配置.ILog当所需名称包含已定义的名称时,Log4net似乎正在返回,而不是等于名称时.
当名称与配置中定义的名称相同时,如何让Log4net仅返回有效的记录器?
要与外部数据源进行交互,我需要传递一个已经过MD5哈希的滚动安全密钥(我们每天需要生成一个新的MD5哈希密钥).
我是否在每次调用外部馈送时都要进行交易.我需要有一个大约10个字符的字符串作为Feed.
它适用于ASP.NET(C#/ .NET 3.5)站点,并且几乎每个页面都使用了feed.我最好每天生成一次哈希值,然后将其存储在应用程序缓存中,并记录内存,或者在每次请求时生成内存吗?
我正在添加watchify到我们的构建过程中,但我想提出一个前提条件来监视运行,那就是更改的文件通过了我们的linting步骤(正在使用ESLint).
我在想这样做:
function runBrowserify(watch){
var babel = babelify.configure({
optional: ['es7.objectRestSpread']
});
var b = browserify({
entries: './app/main.js',
debug: true,
extensions: ['.jsx', '.js'],
cache: {},
packageCache: {},
fullPaths: true
})
.transform(babel);
if(watch) {
// if watch is enable, wrap this bundle inside watchify
b = watchify(b);
b.on('update', function(ids) {
//run the linting step
lint(ids);
//run the watchify bundle step
gutil.log(gutil.colors.blue('watchify'), 'Started');
bundleShare(b);
});
b.on('time', function (time) {
gutil.log(gutil.colors.blue('watchify'), 'Finished', 'after', gutil.colors.magenta(time), gutil.colors.magenta('ms'));
});
}
bundleShare(b);
}
function …Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×4
asp.net ×1
browserify ×1
eslint ×1
generics ×1
gulp ×1
katana ×1
knockout.js ×1
log4net ×1
md5 ×1
mocking ×1
msbuild ×1
mvp ×1
owin ×1
performance ×1
reflection ×1
rhino-mocks ×1
watchify ×1