PHP 有其神奇的方法__call,__callStatic可以拦截对不存在方法的调用。我正在寻找一种方法来拦截对不存在函数(位于命名空间而不是类型内的函数)的调用。
可以吗(PHP7)?
有一段时间我考虑过将函数放在代理类中,但是名称空间可以跨越多个文件,如果我没有记错的话,PHP没有分部类,因此这种方法没有用。
更新:每个命名空间有多个文件问题。
假设我有文件 A.php 和 B.php,它们都具有相同的命名空间,例如Text。考虑将所有函数放入代理类中。现在我有文件 C.php 并且我有 call Text\indexOf(...)。但是我不知道这是否是Text\proxyA::indexOf因为Text\proxyB::indexOf我拥有的所有信息都是命名空间的名称 -- Text-- 和函数名称。所以从呼叫者的角度来说,我很高兴。
这个问题可能被视为我上一个问题的后续问题:How to run generated blazor web client from command line?
我已经正确编写了 Blazor Web 客户端(仅包含单个项目的解决方案),我可以从 Visual Studio 或命令行运行它。
现在我将项目发布到该文件夹,我想从该文件夹运行它——问题是所有内容都放在“wwwroot/_framework”子文件夹中,我没有看到运行所有这些东西所需的服务器代码。
那么我如何让VS也发布所需的服务器呢?
简而言之,我想获取所需的所有文件,因此我可以输入“dotnet myapp.dll”或类似的内容,服务器将从我的 blazor 应用程序启动。当我从 VS 运行它时会发生什么。
我想放弃对linq表所做的所有更改(这意味着 - 我使用linq,数据在客户端更改,服务器上的数据完好无损).这该怎么做?
编辑:问题部分解决
http://graemehill.ca/discard-changes-in-linq-to-sql-datacontext/
只要您不使用事务,它就可以工作.当你这样做并且使用混合"模式"作为记录时,存在一个问题:
begin trans
insert a record
update inserted record
commit trans
Run Code Online (Sandbox Code Playgroud)
当您更新上面的记录时,Linq将其计为更新记录,如果出现异常,您有两个操作 - 事务将被回滚,Linq端的数据将被丢弃.在丢弃更改时,Linq尝试从数据库中获取它(丢弃更新意味着为记录重新获取数据),但由于所有更改都已回滚,因此没有更新记录.
如何以智能通用方式改进DiscardChanges方法以处理事务.或者如何更改事务/ discard-submitchanges的工作流程以使所有这些工作一起工作?
那些不是聪明的解决方案:
我想得到一个属性的getter,所以我可以传递给一个需要Func的方法.现在我将getter提取到Get方法,并在需要getter函数时使用此方法.
关于背景的几句话:我有A类属性,我有另一个类T,它跟踪A(以及B类,C类等)的一些属性.保持跟踪意味着当T的对象被询问有关被跟踪属性的当前值时,它应该给出这样的信息.
一种方法可能是变更通知机制,但A类不知道跟踪的是什么 - 所以这是非常错误的方法.您必须重写可能被跟踪的所有类.此外,通知必须始终发送,即使跟踪器根本不会被问及值.
简单地传递方法如何读取值(属性的getter)似乎更方便,并且跟踪器将在需要时使用它.没有开销,非常简单.
我使用VS2010,DataGrid(WPF附带的那个),并手动创建行和列。根据行的状态,我为行设置了各种颜色(但为简单起见,假设它是黄色)。之所以起作用,是因为datagrid使用标签来显示文本,并且当我为行设置背景时,它也反映在标签小部件中。
但是,我无法ctrl + c(复制)单元格的内容,因此现在我为列创建自定义模板,并使用文本框显示数据。
Texbox会阻止单元格的背景,所以实际上,我得到了(例如)带有带有黄色边框的白色单元格(文本框)的数据网格。
如何使文本框(我的情况)知道单元格的背景色?我尝试使用技巧并为所有文本框设置透明笔刷,但是单元格(文本框)中仍然出现白色背景。
当前代码:
grid.BeginInit();
grid.Columns.Clear();
int i = 0;
var glass_brush = new SolidColorBrush(Color.FromArgb(255,0,0,0));
foreach (var db_col in query.FieldNames)
{
var template = new DataTemplate();
var elemFactory = new FrameworkElementFactory(typeof(TextBox));
elemFactory.SetBinding(TextBox.TextProperty, new Binding(String.Format("Visual[{0}]", i)));
// make the background transparent -- it does not work though
elemFactory.SetValue(TextBlock.BackgroundProperty,glass_brush);
template.VisualTree = elemFactory;
var col = new DataGridTemplateColumn();
col.CellTemplate = template;
col.IsReadOnly = true;
col.Header = db_col;
grid.Columns.Add(col);
++i;
}
{
grid.Items.Clear();
foreach (var db_row in diffs) …Run Code Online (Sandbox Code Playgroud) 引自:http: //msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx
"调用事件只能在声明事件的类中完成."
我很困惑为什么会有这样的限制.如果没有这个限制,我将能够编写一个类(一个类),这个类一次用于管理发送给定类别的事件 - 比如INotifyPropertyChanged.
有了这个限制,我必须重新复制并粘贴相同(相同!)的代码.我知道C#的设计者不重视代码重用太多(*),但是gee ...复制和粘贴.这有多高效?
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
Run Code Online (Sandbox Code Playgroud)
在每个班级改变一些事物,到你生命的尽头.害怕!
所以,虽然我正在恢复我的额外发送课程(我太容易上当了),以旧的,"好"的复制和粘贴方式,你能看到吗?
如果你知道如何避免这种限制的任何技巧 - 也不要犹豫回答!
(*)具有多重继承我可以更好地编写通用发送方,但是C#没有多重继承
介绍界面
public interface INotifierPropertyChanged : INotifyPropertyChanged
{
void OnPropertyChanged(string property_name);
}
Run Code Online (Sandbox Code Playgroud)
为PropertyChangedEventHandler添加新的扩展方法Raise.然后为此新接口添加mediator类,而不是基本的INotifyPropertyChanged.
到目前为止,它是最小的代码,让我们代表它的所有者从嵌套对象发送消息(当所有者需要这样的逻辑时).
谢谢大家的帮助和想法.
Guffa写道:
"通过从外部触发事件,你无法做出任何事情,"
这很有意思,因为......我可以.这正是我要问的原因.看一看.
假设你有类字符串.不好意思吧?但是让我们用Invoker类打包它,它每次发生变化时都会发送事件.
现在:
class MyClass : INotifyPropertyChanged
{
public SuperString text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,当文本被更改时,MyClass被更改.因此,当我在文本内部时,我知道,如果我只拥有所有者,那么它也会被更改.所以我可以代表它发送活动.它在语义上是100%正确的.
备注:我的课程稍微聪明一点 - 所有者设置是否有这样的逻辑.
传递事件处理程序的想法 - …
我不能强调这一点 - 设计原因.
在C++中,您可以使用类(类型)引用或对象(实例)引用获取静态元素.在C#中只有类型引用.我在C#中写的越多,它引起的问题就越多 - 只有片刻(一次又一次)我所拥有的只是对象,并且为了通过创建来避免缺少类型(因此访问静态元素)的问题常规元素,它将值来回传递给静态元素.
可以说,在一个类中创建常规(非静态)元素作为静态元素的代理是很小的代价,但我不知道我实际支付的是什么.对我来说,负担是显而易见的,不是关键的,而是烦人的,那么有什么好处呢?
有什么设计原因,在C#中你不能引用对象的静态元素(当然是从外部)?
public class Foo
{
public static readonly string Name = "name";
}
...
Foo foo = new Foo();
Run Code Online (Sandbox Code Playgroud)
现在考虑"Foo.Name"对"foo.Name";
对我来说,最常用的类之一是用于枚举的关联数组(我的自定义类) - AssocEnum.它就像词典,但所有键都是预填充的.最重要的是,我有像EnumBit(这是AssocEnum)和EnumNames(它是AssocEnum)这样的类.与Dictionary不同,每个给定枚举的实例都具有相同的Keys属性.这意味着你可以获得AssocEnum类型的密钥及其实例.
困扰我的是我必须引入两个属性TypeKeys(用于类)和Keys(例如 - 它只是TypeKeys的代理),因为我无法调用静态TypeKeys作为AssocEnum的例子.
天真的问题,但这是我迈向JSF的第一步,所以请原谅我;-)
我正在遵循David Geary,Cay S. Horstmann(第3版)的"Core JavaServerFaces"中的第一个示例的所有步骤.
什么有效:
当我将war文件复制到GlassFish的autodeploy子目录并尝试在GF中显示相应的页面时,问题就开始了.作为回报,我得到404错误,在日志中我发现:
选择文件/opt/glassfish3/glassfish/domains/domain1/autodeploy/login.war进行自动部署.
模块/ opt/glassfish3/glassfish/domains/domain1/applications/login无法识别模块类型
没有安装的容器能够处理此应用程序登录
自动部署失败:/opt/glassfish3/glassfish/domains/domain1/autodeploy/login.war.
glassfish 3.1.2,java 1.6.0_29,opensuse 11.4.
问题是如何使这个代码工作?
jar tvf login.war
0 Thu Apr 12 22:24:24 CEST 2012 META-INF/
71 Thu Apr 12 22:24:24 CEST 2012 META-INF/MANIFEST.MF
0 Mon Jun 27 10:13:54 CEST 2011 src/
0 Mon Jun 27 10:13:54 CEST 2011 src/java/
0 Mon Jun 27 10:13:54 CEST 2011 src/java/com/
0 Thu Apr 12 22:16:32 CEST 2012 src/java/com/corejsf/
603 Thu Apr 12 22:16:32 …Run Code Online (Sandbox Code Playgroud) 我正在寻找标题中所述问题的一般解决方案.但是,插图考虑我的真实情况.我想得到wstring,像这样:
L"hello"
Run Code Online (Sandbox Code Playgroud)
但是当我有一个宏:
#define MACRO(S) ...
Run Code Online (Sandbox Code Playgroud)
并致电:
MACRO("hello") // no L prefix
Run Code Online (Sandbox Code Playgroud)
如何定义它wstring,像以前一样?
L S
Run Code Online (Sandbox Code Playgroud)
被视为2个符号.
当您阅读诸如Regex: NFA 和 Thompson's algorithm 之类的帖子时,一切看起来都相当简单,直到您意识到在现实生活中您不仅需要像“7”或“b”这样的直接字符,而且还需要:
[A-Z]
[^_]
.
Run Code Online (Sandbox Code Playgroud)
即字符类(或范围)。因此我的问题是——如何使用字符范围构建 NFA?使用像“not A”、“anything else”这样的元字符然后计算重叠范围?这将导致在使用最终自动机时使用树状结构,而不仅仅是表格。
更新:请假设大小不平凡 (>>256) 字母表。
我问的是 NFA,但后来我也想将 NFA 转换为 DFA。