小编Sco*_*nen的帖子

从类型名称获取可为空类型

我有以下场景,我得到一个如下所示的字符串

"System.DateTime?"
Run Code Online (Sandbox Code Playgroud)

或者

"int?"
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是检索该字符串的 System.Type ,它看起来像:

{Name = "Nullable 1" FullName = "System.Nullable1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}

现在我知道如何从字符串中检索类型我可以Type.GetType("System.DateTime")在处理不可为空类型时或typeof(DateTime?)当我知道它将为 DateTime 为空时说,但在这种情况下,我不知道什么可以为空类型可能会出现并将只接收它作为字符串。

c# types nullable

4
推荐指数
2
解决办法
1338
查看次数

防止对 MVC 的蛮力攻击

我想弄清楚如何在我的网站上对抗蛮力攻击。根据我所做的所有研究,最佳答案是帐户锁定和验证码。

如果我锁定用户,那么我将拒绝他们提供 x 时间的服务。这意味着如果攻击者要攻击 10 个不同的帐户,他将全部锁定。然后当时间到了他会再次锁定它们。基本上他可以坚持下去并无限期地锁定用户。用户可以联系我,但现在我必须处理 10 张票,如果可能的话,我宁愿避免这项工作。所以我没有完全理解的是这有什么用?攻击者可能不会被考虑在内,但他们会给我和用户带来很多悲伤。

我该如何解决这个问题?禁止 Ip 似乎毫无意义,因为它可以很容易地改变。

c# asp.net security brute-force asp.net-mvc-5

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

迭代接口的实现并调用方法

假设我有几个接口的实现:

public interface IDemoInterface
{
    void DemoMethod();
}

public class DemoClass1 : IDemoInterface
{
    public void DemoMethod()
    {
        Console.WriteLine("DemoClass1");
    }

}

public class DemoClass2 : IDemoInterface
{
    public void DemoMethod()
    {
        Console.WriteLine("DemoClass2");
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试定义这样的实现的数组,并为每个实现调用接口方法.基本上,做这样的事情(以下是一个非工作代码 - 只是我想要做的一个例子):

public static void Run()
{
    var demoClasses = { DemoClass1, DemoClass2};

    foreach (var demoClass in demoClasses)
    {
        var implementation = demoClass as IDemoInterface;
        implementation.DemoMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

完成它的最佳方法是什么?使用Reflection是唯一的方法吗?

.net c#

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

为什么 URI 构造函数从 baseUri 参数中删除部分路径?

public class Program
{
    public static void Main()
    {
        Uri baseUri = new Uri("http://localhost:7777/BasePath/");
        Uri uri = new Uri(baseUri, "/controller");
        Console.WriteLine(uri);
    }
}
Run Code Online (Sandbox Code Playgroud)

从 uri 中擦除 /BasePath 是有意的行为吗?最终结果是什么http://localhost:7777/controller

c# uri

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

空接口有什么作用?

我正在使用的代码具有一个空接口:

public interface ICube {}
Run Code Online (Sandbox Code Playgroud)

它没有方法或属性。

一些类实现,ICube而其他接口则继承自ICube
请有人告诉我,ICube接口可能有什么好处?

c# oop interface

3
推荐指数
2
解决办法
150
查看次数

我们可以从构造函数中调用异步方法吗?

我需要从 mvc 应用程序调用第三方异步方法。此异步方法的名称是 ForceClient.QueryAsync。它来自一个开源项目:https ://github.com/developerforce/Force.com-Toolkit-for-NET/ 。

下面工作正常,当进程处于 mvc 的 View 阶段时, model.Opportunity 包含预期信息:

public async Task<ActionResult> MyController(string Id) {
    . . . .
    MyModel model = new MyModel();
    var client = new ForceClient(instanceUrl, accessToken, apiVersion);
    var qry = await client.QueryAsync<MyModel.SFOpportunity>(
            "SELECT Name, StageName FROM Opportunity where  Id='" + Id + "'");
    model.Opportunity = qry.Records.FirstOrDefault();
    . . . .
return View(viewName, myModel);
}
Run Code Online (Sandbox Code Playgroud)

但下面不起作用。当流程处于View阶段时,model.Opportunity为null。我做了一些调试,发现流程是这样的:

1)步骤1

2)步骤2

3)在View阶段。此时 model.Opportunity 为 null,我需要将其填充。

4)步骤3。

public async Task<ActionResult> MyController(string Id) {
    . . . …
Run Code Online (Sandbox Code Playgroud)

c#

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

当函数属于必须解析的类时,如何使用 Autofac 注册委托或函数?

我正在使用 Autofac。我想将委托注入到一个类中:

public delegate ValidationResult ValidateAddressFunction(Address address);

public class OrderSubmitHandler
{
    private readonly ValidateAddressFunction _validateAddress;

    public OrderSubmitHandler(ValidateAddressFunction validateAddress)
    {
        _validateAddress = validateAddress;
    }

    public void SubmitOrder(Order order)
    {
        var addressValidation = _validateAddress(order.ShippingAddress);
        if(!addressValidation.IsValid)
            throw new Exception("Your address is invalid!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要注入的实现ValidateAddressFunction来自一个必须从容器解析的类,因为它有自己的依赖项:

public class OrderValidator
{
    private readonly ISomeDependency _dependency;

    public OrderValidator(ISomeDependency dependency)
    {
        _dependency = dependency;
    }

    public ValidationResult ValidateAddress(Address address)
    {
        // use _dependency
        // validate the order
        // return a result
        return new ValidationResult();
    } …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection autofac

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

Microsoft Repository Pattern 文档中 IAggregateRoot 接口的用途

我正在查看 Microsoft 网站上的 Respository Pattern。

存储库模式

我部分我不明白 IAggregateRoot 做什么?

public interface IRepository<T> where T : IAggregateRoot
    {
        //....
    }
Run Code Online (Sandbox Code Playgroud)

每个存储库类是否可以相互交互,例如 OrderRespository 可以使用 Product 存储库。

c# database design-patterns repository-pattern

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

接受两个接口之一的方法

问题

我有两个接口IImporterIExporter一个处理这些接口实例的类:

class IoManager
{
    public ReadOnlyCollection<IImporter> Importers { get; } 
    public ReadOnlyCollection<IExporter> Exporters { get; }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这个类中,我想实现一个Add(...)可以添加导入器或导出器的方法.

我知道我可以为两个接口创建一个重载

public void Add(IExporter exporter);
public void Add(IImporter importer);
Run Code Online (Sandbox Code Playgroud)

问题是如果我想添加一个实现两个接口的对象,比如CsvIo : IImporter, IExporter通过Add(...)函数,我得到一个不明确的调用编译错误,因为CsvIo两个重载都接受了.

我不想做什么

  • 我不想重载重命名为不同的名字,因为大多数类型的实现这两个接口和我想要实现的类型一致的行为IExporter,IImporter或两者兼而有之.
  • 我不想创建由两个接口实现的"父"接口,因为这似乎是一个hacky解决方案
  • 我不想在Add(...)调用中强制转换类型Add((IImporter) CsvIoInstance),因为这表明只使用了这种类型的导入器.但是两个重载都检查对象是否实现了两个接口并相应地将它添加到两个列表中.

这个问题

有没有办法以连贯的方式接受不同的类型(这样每个类型的调用看起来都一样)?

编辑

澄清我的实现:这是插件系统的一部分.我想添加多种方式来存储我的数据(以便其他应用程序可以使用它).该IExporter接口用于在IImporter接口加载数据时存储数据.该IoManager管理所有注册的插件.当然,一个类可以(并且可能是常见的)实现某种文件格式的导出和导入.这就是为什么我希望Add(...)函数在所有情况下都相似.

但是,再次考虑它(如评论中已经说明的那样)插件只在运行时才知道,这使得模糊性成为我认为的过时问题.所以这只适用于内置类型.

.net c#

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

Parallel.ForEach 和 DataTable - DataTable.NewRow() 不是线程安全的“读取”操作吗?

我正在转换现有应用程序以利用多个处理器。我有一些嵌套循环,并且我已将最内层循环转换为 Parallel.Foreach 循环。在原始应用程序中,在最内层循环内,代码将调用DataTable.NewRow()实例化适当布局的新 DataRow、填充列并将填充的 DataRow 添加到带有 的 DataTable 中DataTable.Add()。但由于 DataTable 仅对于读取操作是线程安全的,因此我已转换处理以将填充的 DataRow 对象添加到对象中ConcurrentBag<DataRow>。然后,一旦 Parallel.Foreach 循环完成,我将迭代 ConcurrentBag 并将 DataRow 对象添加到 DataTable 中。它看起来像这样......

DataTable MyDataTable = new DataTable()
// Add columns to the data table

For(int OuterLoop = 1; OuterLoop < MaxValue; OuterLoop++)
{
    //Do Stuff...

    ConcurrentBag<DataRow> CB = new ConcurrentBag<DataRow>();

    Parallel.Foreach(MyCollectionToEnumerate, x => 
    {
        //Do Stuff

        DataRow dr = MyDataTable.NewRow();
        // Populate dr...
        CB.Add(dr);
    {);

    ForEach(DataRow d in CB)
        MyDataTable.Add(d);
}
Run Code Online (Sandbox Code Playgroud)

因此,当运行时,我看到“索引超出了数组的范围”。调用时出现异常MyDataTable.NewRow()。但是 NewRow() …

c# parallel-processing datatable parallel.foreach

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