小编Caf*_*eek的帖子

用反射创建对象

我正在尝试编写一个NullObject创建方法,在其中传入一个实现ICreateEmptyInstance接口(即为空)的类名,并且它遍历它的属性,寻找实现的其他类,ICreateEmptyInstance并将创建那些的"Null"实例.

public interface ICreateEmptyInstance { }

public static class NullObject
{
    public static T Create<T>() where T : ICreateEmptyInstance, new()
    {
        var instance = new T();

        var properties = typeof(T).GetProperties();
        foreach (var property in properties.Where(property => typeof(ICreateEmptyInstance).IsAssignableFrom(property.PropertyType)))
        {
            var propertyInstance = NullObject.Create<property.PropertyType>();
            property.SetValue(instance, propertyInstance);
        }

        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该可以用它来称呼它

var myEmptyClass = NullObject.Create<MyClass>();
Run Code Online (Sandbox Code Playgroud)

我遇到问题的地方是在foreach循环中,有了这一行

var propertyInstance = NullObject.Create<property.PropertyType>();
Run Code Online (Sandbox Code Playgroud)

...显然这不起作用,但我怎样才能完成创建"空对象"以分配给我正在创建的实例.

编辑:那么泛型呢?我想创建空实例

  foreach (var property in properties.Where(property => property.GetType().IsGenericType))
  {
       var propertyInstance = Enumerable.Empty<>(); //TODO: …
Run Code Online (Sandbox Code Playgroud)

c# reflection null-object-pattern

2
推荐指数
1
解决办法
164
查看次数

在WCF服务中序列化MethodBase和Exception类型

我创建了一个用于记录异常的WCF服务(我意识到如果网络出现故障,就不会记录任何内容......有回退的地方)

无论如何,它有两种方法

int LogException(MethodBase methodBase, Exception exception)
int LogMessage(MethodBase methodBase, string message, string data)
Run Code Online (Sandbox Code Playgroud)

当我尝试将服务添加到新项目时,不会创建.cs文件.我运行了svcutil,并将.cs和config设置复制到项目中,并尝试使用生成的客户端调用服务.我收到以下两个错误

尝试序列化参数http://tempuri.org/:methodBase时出错 .InnerException消息是'Type'System.Reflection.RuntimeMethodInfo',数据协定名称为'RuntimeMethodInfo:http://schemas.datacontract.org/2004/07/System.Reflection'不是预期的.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.有关更多详细信息,请参阅InnerException.

内心异常

键入'System.Reflection.RuntimeMethodInfo',数据协定名称为'RuntimeMethodInfo:http://schemas.datacontract.org/2004/07/System.Reflection'.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.

我需要做些什么来完成这项工作?

.net service wcf datacontractserializer

1
推荐指数
1
解决办法
2312
查看次数

嵌套存储过程中事务之间的关系?

我把交易放在我所有的"设定"程序中.没问题.一切正常.

在这种情况下,我需要一个设置过程,谢天谢地,只需要调用一次,或者可能会使事情进一步复杂化.

所以快乐的沐浴会.

  • 我在ProcA并开始交易.
  • 它调用ProcB并启动一个事务.
  • ProcB成功并提交.
  • ProcA成功并承诺.

但是,如果ProcB失败,回滚并重新抛出错误会发生什么.它应该导致ProcA回滚也正确吗?

如果ProcB成功,提交,然后ProcA随后失败,并且回滚......那么ProcB中发生的事情会被回滚吗?还是承诺?

我需要这两个一起工作,要么成功要么失败都要回滚.确保这种情况发生的最佳方法是什么?

我正在使用Microsoft SQL Server 2008 R2(SP1)

注意:如果ProcB需要事务,因为可以在没有ProcA包装的情况下调用它.从技术上讲,ProcA并不总是会调用ProcB(取决于输入).

sql-server stored-procedures transactions sql-server-2008

1
推荐指数
1
解决办法
2556
查看次数

LINQ,列表和添加项目问题

我有以下是一个数组

package.Resources
Run Code Online (Sandbox Code Playgroud)

如果我使用

package.Resources.ToList().Add(resouce);
Run Code Online (Sandbox Code Playgroud)

package.Resources实际上不包含新项目.

我必须使用

var packageList = package.Resources.ToList();
packageList.Add(resource);
package.Resources = packageList.ToArray();
Run Code Online (Sandbox Code Playgroud)

这是为什么?

c# linq list

0
推荐指数
1
解决办法
2886
查看次数