有没有人知道如何修改csproj文件以在构建期间生成代码文件而不实际引用文件?
一个过程如:
这样做的目的是创建一种使用roslyn而不是使用t4模板生成代码文件的方法,一旦您尝试根据属性执行某些操作,这些模板就非常难以使用.
因此,我计划提供一种方法来使用特殊的csharp文件(用于完整语法支持),以基于该特殊文件的内容以编程方式生成文件.
我花了几个星期的时间研究互联网上的资源(主题为msbuild),但直到现在我似乎没有使用正确的关键字.
这个对我来说是最具洞察力的一个:https: //www.simple-talk.com/dotnet/.net-tools/extending-msbuild/
我的猜测是,为了我的目的,正确的构建目标应该是"BeforeCompile",以便以某种方式使用自定义代码文件填充构建过程.
有没有人有我的问题经验,或者知道任何特定的资源来处理这个任务?
我得到它的解决方案:
<UsingTask TaskName="DynamicCodeGenerator.DynamicFileGeneratorTask" AssemblyFile="..\DynamicCodeGenerator\bin\Debug\DynamicCodeGenerator.dll" />
<Target Name="DynamicCodeGeneratorTarget" BeforeTargets="BeforeBuild;BeforeRebuild">
<DynamicFileGeneratorTask>
<Output ItemName="Generated" TaskParameter="GeneratedFilePaths" />
</DynamicFileGeneratorTask>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" />
<!-- For clean to work properly -->
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有按照建议使用属性组覆盖
更新:此链接也很有趣:https://github.com/firstfloorsoftware/xcc/blob/master/FirstFloor.Xcc/Targets/Xcc.targets
所以我目前正在评估来自telerik的XamarinForms的Xamarin.Forms和UI的试验.
不幸的是,一旦我将库链接到telerik dll,我就会得到一个混乱的Resource.Designer.cs文件.
我"Resource" contains no Definition for "Animation".从这样的代码中得到5000个错误(也是Resource.Drawable,Resource.Style,Styleable,...):
public static void UpdateIdValues()
{
global::Telerik.XamarinForms.ChartRenderer.Android.Resource.Animation.abc_fade_in = global::MyNamespace.XamarinForms.Droid.Resource.Animation.abc_f
global::Telerik.XamarinForms.ChartRenderer.Android.Resource.Animation.abc_fade_out = global::MyNamespace.XamarinForms.Droid.Resource.Animation.abc_fade_out;
....
Run Code Online (Sandbox Code Playgroud)
这对任何人都响了吗?
已经开始在telerik上开票,但我猜其他人可能遇到同样的问题,可能需要修复.
所以我实际上没有问题,因为我已经解决了它,但是如果其他人遇到这个问题,总是很高兴有一个简洁的解决方案.
虽然有很多"Can't create handler inside thread which has not called Looper.prepare()"- 问题没有用xamarin标记.(所以他们都是java,我有0个匹配"无法在线程中创建处理程序,而没有调用Looper.prepare()[xamarin]")
在我的脑海里,我总是遇到以下问题,在SO上找不到问题:
如何确保我的默认构造函数用于序列化/激活器,同时确保不鼓励消费者使用它?
在过去,我使用了类似的提示
///<summary>
/// Do not use the default constructor
///</summary>
Run Code Online (Sandbox Code Playgroud)
这显然很容易被忽视,除非你小心地盘旋并检查你使用的每个课程.
虽然我会得到更好的视觉指示,如下所示:
[Obsolete("Do not use the default constructor")]
Run Code Online (Sandbox Code Playgroud)
这将彻底滥用这个让我颤抖的功能.
有没有什么常见的方式我不知道要处理这个问题,还是只是我首先对此感到恼火?
我的代码收到此错误消息:“从范围''引用的'System.Int32'类型的变量'assignVal',但未定义”
我退房了
但不幸的是,我的示例似乎更简单,但由于某种原因仍然无法正常工作。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq.Expressions;
using System.Reflection.Emit;
using System.Threading.Tasks;
using static System.Linq.Expressions.Expression;
namespace ExpressionTests
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine(GetSyncAddExpression()(5) == 6);
Console.ReadKey();
Console.WriteLine(await GetTaskAddExpression()(5) == 6);
Console.ReadKey();
}
private static Func<int, Task<int>> GetTaskAddExpression()
{
var fromResultMethod = typeof(Task).GetMethod(nameof(Task.FromResult)).MakeGenericMethod(typeof(int));
var inParam = Parameter(typeof(int), "p1");
var assignmentValue = Variable(typeof(int), "assignVal");
var retVal = Variable(typeof(Task<int>));
var lambda …Run Code Online (Sandbox Code Playgroud) 如果不使用 TrackState 上的属性或为 Publishers + 文章指定 OwnsOne,我似乎无法做到这一点。有什么方法可以在不使用属性的情况下将 TrackState 全局标记为拥有的类型?
(对于通过 google 访问的人:如何使用 fluent api 向实体添加属性?)
(实体 + EF 核心在单独的库中,我不希望在那里依赖 EF)
public class Publisher
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Article> Articles { get; set; } = new List<Article>();
public TrackState State { get; set; }
}
public class TrackState
{
public DateTime? Created { get; set; }
public DateTime? Modified { get; set; }
}
public class Article
{ …Run Code Online (Sandbox Code Playgroud) 所以我创建了自己的ControllerFactory,并且我正在重载GetControllerSessionBehavior以扩展MVC行为.
要做我的自定义工作,我必须对被调用的动作使用反射.然而,我偶然发现了一个奇怪的问题 - 我无法通过访问RequestContext.RouteData来检索操作
在为此设置复制样本时,我无法重现错误.
是否有人知道可能的原因或知道如何通过调用除此之外的请求上下文的方法来检索操作?
public class CustomControllerFactory : DefaultControllerFactory
{
protected override SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
{
if (!requestContext.RouteData.Values.ContainsKey("action"))
return base.GetControllerSessionBehavior(requestContext, controllerType);
var controllerAction = requestContext.RouteData.Values["action"];
var action = controllerAction.ToString();
var actionMethod = controllerType.GetMember(action, MemberTypes.Method, BindingFlags.Instance | BindingFlags.Public).FirstOrDefault();
if(actionMethod == null)
return base.GetControllerSessionBehavior(requestContext, controllerType);
var cattr = actionMethod.GetCustomAttribute<SessionStateActionAttribute>();
if (cattr != null)
return cattr.Behavior;
return base.GetControllerSessionBehavior(requestContext, controllerType);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以调用的操作很好,但无法访问我的控制器工厂中的操作名称:
[Route("Open/{createModel:bool?}/{tlpId:int}/{siteId:int?}")]
public ActionResult Open(int tlpId, int? siteId, bool? createModel = true)
{
}
Run Code Online (Sandbox Code Playgroud)
欢迎任何想法.
更新:
问题似乎与属性路由有关.虽然它在repro中运行良好但它对我来说不适用于生产.
途中发现这一点-一旦 …
我正在做一个小项目,我遇到的问题很可能与我的文件夹结构有关.
如果可能的话,文件夹结构可以保持现有状态,我可能需要一种方法来指定基于每个项目加载哪些packages.config.
我希望这种结构能够确保唯一的文件,而无需通过文件链接维护引用.
但是,为了使编译工作,某些项目需要其他框架目标.现在,除非我可以指定一个分隔packages.config的路径,我被迫将我的csproj文件再次拆分成单独的文件夹?有没有人知道解决这个问题的方法?
由于 msdn 仅提供部分概述(如此处所示),并且我一直在寻找完整的示例,因此我将在这里分享答案。
我已经编写了一个javascript来通过javascript帮助模拟HTML中的WPF DockPanel布局行为.
现在,当我开始将这些面板嵌套到递归级别10时,我遇到了性能问题.奇怪的是,它只不过是普通的递归,并且在最深层次上,所讨论的函数在0.2到2ms之间完成.

现在要么我有一些鬼性能损失,还是在调用javascript的递归时有大量成本?我希望你们其中一个人知道.
如果有成本,显而易见的解决方案将是递归展开,这将是相当悲伤的.
我已经在JavaScript中阅读了SO-Recursive函数调用在此,但这是否真的意味着我可能必须接受recursiondepth n = functioncost*(10 ^(n-1))我会去的每个递归深度?
此外(这反驳了递归比迭代慢的想法)SO - 迭代比递归更快,还是更不容易出现堆栈溢出?
而这个程序员:性能:Javascript中的递归与迭代,它说迭代比递归的速度快4倍(叹息......)
这是一个普遍的问题,独立于浏览器JS引擎.如果你知道它在一个中速度慢但在另一个中速度很快,那么信息也会受到欢迎.我假设它总是一样的.
访问者的包装信息:递归与迭代的影响非常显着.迭代一般胜利.
我有一个包含数十种方法的类 - 我只需要使用其中两个方法并避免依赖注入。
Task<List<ApplicationUser>> GetAllContractors(CancellationToken cancellationToken);
Task<ApplicationUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken);
Run Code Online (Sandbox Code Playgroud)
我当前的尝试:(适用于所有承包商,因为我不需要任何参数即可生效)
users.AddRange(await ManifestJsonLoader.LoadAsync<List<ApplicationUser>>("Mynamespace.sampleUsers.json"));
var userProviderMock = new Mock<IUserProvider>(MockBehavior.Strict);
userProviderMock.Setup(service => service.GetAllContractors(CancellationToken.None)).Returns(Task.FromResult(users));
userProviderMock.Setup(service => service.FindByNameAsync(It.Is<string>(name => users.FirstOrDefault(d => d.UserName == name) != null), It.IsAny<CancellationToken>()));
Run Code Online (Sandbox Code Playgroud)
我一直在寻找“带有参数的最小起订量方法”,但到目前为止没有一个结果回答了我的问题。也许我在这里寻找错误的关键词。
我有以下类似于TextBox组件的组件。然而由于某种原因,内容似乎Value永远不会改变。
我本希望它可以在没有手动 JavaScript 的情况下与数据绑定一起使用,不是吗?
<div class="form-group">
<input type="text" class="form-control" @bind="Value" @onkeyup="OnKeyUp" placeholder="@Placeholder"/>
</div>
@code {
[Parameter]
public string Value { get; set; }
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
[Parameter]
public string Placeholder { get; set; }
private void OnKeyUp(KeyboardEventArgs obj)
{
ValueChanged.InvokeAsync(Value);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用此方法构建服务实现:
我正在使用Microsoft.Extensions.DependencyInjection并试图实现以下目标:
我在这里疯了吗?对我来说,我似乎在这里做些奇怪的事情,因为它不存在用于从另一个ServiceProvider初始化ServiceCollection的API。
注意
我不想在原始ServiceCollection上运行serviceCollection.AddX。
c# ×6
xamarin ×2
asp.net-mvc ×1
blazor ×1
ef-core-2.1 ×1
expression ×1
javascript ×1
moq ×1
msbuild ×1
nuget ×1
performance ×1
recursion ×1
telerik ×1
uri ×1