我需要更改Capacity
类型的动态变量的属性List<*DynamicType*>
.问题是Activator
返回object
-casted变量如果没有指定变量类型而不是正确的List<*DynamicType*>
,我能做的最好的就是将其强制转换为IList
:
DynamicTypeBuilder builder = new DynamicTypeBuilder() { ... };
Type dataType = builder.GenerateType(...);
Type listDataType = typeof(List<>).MakeGenericType(dataType);
IList list = (IList)Activator.CreateInstance(listDataType);
Run Code Online (Sandbox Code Playgroud)
经过一番搜索,我发现只有一个黑客:
dynamic dynamicList = list;
dynamicList.Capacity = dataRowsCount;
Run Code Online (Sandbox Code Playgroud)
虽然这在我的情况下是可以接受的,但我想知道是否还有另一种方法可以做到这一点.
我找到了以下类实例:(Monad m, (~) * a ()) => LaTeXC (LaTeXT m a)
但不能完全理解它的上下文.
什么(~) * a ()
意思?我在哪里可以阅读它?
我需要创建一个人类可读的XML文件.XmlWriter似乎对此几乎是完美的,但我想插入换行符,或者一般来说,我想要它们的自定义空格.WriteRaw和WriteWhitespace似乎都不能在元素中的属性之间起作用.后者看起来应该工作(此方法用于手动格式化您的文档),但抛出InvalidOperationException
(状态元素内容中的Token StartAttribute将导致无效的XML文档),如果用于代替下面的注释.
是否有XmlWriter或支持此功能的第三方XML库的解决方法?
示例代码(LINQPad语句就绪):
var sb = new StringBuilder();
var settings = new XmlWriterSettings {
OmitXmlDeclaration = true,
Indent = true,
IndentChars = " ",
};
using (var writer = XmlWriter.Create(sb, settings)) {
writer.WriteStartElement("X");
writer.WriteAttributeString("A", "1");
// write line break
writer.WriteAttributeString("B", "2");
// write line break
writer.WriteAttributeString("C", "3");
writer.WriteEndElement();
}
Console.WriteLine(sb.ToString());
Run Code Online (Sandbox Code Playgroud)
实际结果:
<X A="1" B="2" C="3" />
Run Code Online (Sandbox Code Playgroud)
期望的结果(B和C可能不与A对齐 - 那很好,/>可以留在C上的线上):
<X A="1"
B="2"
C="3"
/>
Run Code Online (Sandbox Code Playgroud) 我有一个小的工作SDL2示例(C++教程的简单端口),我正在尝试使用( - >)r monad重构渲染代码.这是没有重构的样本的工作部分
renderClear renderer
renderCopy renderer texture nullPtr nullPtr
renderPresent renderer
Run Code Online (Sandbox Code Playgroud)
制作和运行 - 纹理就在那里.都
renderClear renderer
flip ($) renderer $ do
copy texture nullPtr nullPtr
renderPresent renderer
Run Code Online (Sandbox Code Playgroud)
和
renderClear renderer
renderCopy renderer texture nullPtr nullPtr
flip ($) renderer $ do
present
Run Code Online (Sandbox Code Playgroud)
工作也很好.然而
renderClear renderer
flip ($) renderer $ do
copy texture nullPtr nullPtr
present
Run Code Online (Sandbox Code Playgroud)
只是绘制黑色窗口就是这样.present
是的别名renderPresent
和copy
是renderCopy
与第一个参数转移到结束.这与使用IO的这些功能有关吗?我怎样才能解决这个问题?
假设我们有两个类型的函数(a -> b -> c)
.我希望有一个单一的功能,其中,当应用于a
和b
将给予d
,从合并c
由一个特定的功能(c -> c -> d)
.我用箭头想出了这个解决方案:
combine :: (a -> b -> c) -> (a -> b -> c) -> (c -> c -> d) -> (a -> b -> d)
combine f g op = ((uncurry op) .) . (uncurry (&&&)) . (f &&& g)
Run Code Online (Sandbox Code Playgroud)
有没有办法以更优雅的方式做到这一点,或者将其概括为适用于更大的功能(例如(a -> b -> c -> d) -> (a -> b -> c -> d) -> (d -> …