C#中具有类型和操作的查找表

时间:2019-01-22 07:50:13

标签: c# dictionary methods types lookup-tables

我想将我的许多表更改为查询表。

我有类型和方法。我要配对。

emitTraceInfo

我必须创建一个if (propertyType == typeof(bool) || propertyType == typeof(bool?)) DoBool(propertyType); if (propertyType == typeof(DateTime) || propertyType == typeof(DateTime?)) DoDateTime(propertyType); if (propertyType == typeof(Guid) || propertyType == typeof(Guid?)) DoGuid(propertyType); 吗?还是最优雅的方式做到这一点?

您能给我一些建议,从哪里开始或在哪里找到解决方案?

4 个答案:

答案 0 :(得分:1)

由于这比单纯的查找更多的是控制代码流,所以我可能会使用一种面向对象的方法,并将每个“处理程序”的代码放在单独的类中(在基类中包含一些普通的东西)。

您可以创建一个通用界面,例如

Function Excel-Write{
$RD = "C:\temp\Servers\*.csv"
$CsvDir = $RD

$csvs = dir -path $CsvDir
$outputxls = ""C:\temp\Servers\Complete.Xlsx"
$Excel = New-Object -ComObject excel.application
$workbook = $excel.Workbooks.add(1)

foreach($iCsv in $csvs){
  $WB = $csvs.Length
    #$Excel.displayAlerts = $false
    $Worksheet = $workbook.worksheets.add(1)
    $Worksheet.name = $Group

    $TxtConnector = ("TEXT;" + $iCsv)
    $Connector = $worksheet.Querytables.add($txtconnector,$worksheet.Range("A1"))
    $query = $Worksheet.QueryTables.item($Connector.name)

    $query.TextfileOtherDelimiter = $Excel.Application.International(5)

    $Query.TextfileParseType =1
    $Query.TextFileColumnDataTypes = ,2 * $worksheet.cells.column.count
    $query.AdjustColumnWidth =1

    $Query.Refresh()
    $Query.Delete()

        $workbook.Save()

}
$Workbook.SaveAs($outputxls,51)
$Excel.quit()
} 

...,然后根据需要将处理程序的实现放到类型为public interface ITypeHandler { void HandleType(Type type); } 的字典中,或者可以在接口上有一个属性来显示其处理的类型,然后从列表中选择(也许是Dependency基于此属性的注入的处理程序。

这增加了好处,例如关注点分离,可测试性等。

(请注意,* Handler不是一个很好的名字,您将不得不根据所涉及的场景创建一个更好的名字。)

答案 1 :(得分:0)

您可以创建一个pip install tensorflow-transform

Dictionary<Type, Action<Type>>

然后这样称呼它:

var dict = new Dictionary<Type, Action<Type>>() {
    {typeof(bool), DoBool},
    {typeof(bool?), DoBool},
    {typeof(DateTime), DoDateTime},
    {typeof(Datetime?), DoDateTime},
    {typeof(Guid), DoGuid},
    {typeof(Guid?), DoGuid}
};

答案 2 :(得分:0)

您可以创建一种方法来初始化具有指定类型的查找表,以避免重复。

private readonly IDictionary<Type, Action<Type>> _lookup;

然后,您可以定义用于初始化_dict的方法,

private void AddEntry<T>(Action<Type> action) where T : struct
{       
    _lookup[typeof(T)] = action;
    _lookup[typeof(Nullable<T>)] = action;
}

private void DoInt(Type type) { /* implementation */ }

AddEntry<bool>(type => { /* implementation */ });
AddEntry<int>(DoInt);

答案 3 :(得分:0)

我创建了自己的实现,该实现稍有不同,但是我使用了@DaggeJ建议,非常感谢!

首先,我创建了一个基本处理程序类。之后,我在不同的类型类上使用了此基础。您可以在下面看到它。

BaseClass:

public abstract class QueryHandler<T> where T : class
{
    //I added here more property. 

    public abstract Type[] Types { get; }

    protected QueryHandler(//Properties)
    {
        //Properties null check
    }

    public abstract IQueryable<T> Handle();
}

后代:

internal class GuidQuery<T> : QueryHandler<T> where T : class
{
    public override Type[] Types => new Type[] { typeof(Guid), typeof(Guid?) };

    public GuidQuery(//Properties) : base(//Properties)
    {
    }

    public override IQueryable<T> Handle()
    {
        // Implementation
    }
}

用法:

public IQueryable<T> GetQuery()
{
    var queryHandlerList = new List<QueryHandler<T>>()
    {
        new IntQuery<T>(//Properties),
        new DateTimeQuery<T>(//Properties),
        new StringQuery<T>(//Properties),
        new BoolQuery<T>(//Properties),
        new GuidQuery<T>(//Properties),
        new EnumQuery<T>(//Properties)
    };
}

return query = queryHandlerList.FirstOrDefault(h => GetType<T>(h, property.PropertyType)).Handle();

private bool GetType<T>(QueryHandler<T> handler, Type type) where T: class
{
    if (handler.Types.FirstOrDefault(t => t == type) == type || handler.Types.FirstOrDefault(t => t == type.BaseType) == type.BaseType) return true;

    return false;
}