【问题标题】:Returning the data type of columns in a generic C# class返回通用 C# 类中列的数据类型
【发布时间】:2014-02-13 23:21:44
【问题描述】:

我正在尝试将以下一段 java 代码转换为 C#,但在需要获取列的数据类型时遇到了问题。我不太确定我将使用的函数或过程调用。

.NET 代码

namespace Workflow.DataTypes
{
    [Serializable]
    public class DataColumn1
    {
        private Type _dataTypes = null;
        private string _columnName = null;
        private string _defaultValue = null;

        public DataColumn1(string columnName, Type dataType)
            : this(columnName, typeof(string), null)
        {
        }

        public DataColumn1(string columnName, Type dataType, string defaultValue)
        {
            SetColumnName(columnName);
            SetDataType(dataType);
            SetDeafultValue(defaultValue);
        }

        public string GetDefaultValue()
        {
            return _defaultValue;
        }

        public bool IsDefaultValueDefined()
        {
            return _defaultValue != null && _defaultValue.Trim().Length > 0;
        }

        public void SetDeafultValue(string def)
        {
            _defaultValue = def;
        }

        public string GetColumnName()
        {
            return _columnName;
        }

        public void SetColumnName(string columnName)
        {
            this._columnName = _columnName;
        }

        public Type GetDataType()
        {
            return _dataTypes;
        }

        public void SetDataType(Type types)
        {
            this._dataTypes = _dataTypes;
        }

        public void SetDataType(string type)
        {
            try
            {
                SetDataType(type != null ? typeof (Type) : typeof (string));
            }
            catch (ArgumentException e)
            {
                // to do JavaUtils.enumToList(DataTypes.class)
                throw new ArgumentException("Unsupported data type: " + type + ". Supported types: " );
            }
        }

        public override string ToString()
        {
            return GetColumnName() + "[" + GetDataType() + "]" + (IsDefaultValueDefined() ? " (" + _defaultValue + ")" : "");
        }
    }
}

我正在寻找的只是如何返回列名及其数据类型。感谢您抽出宝贵时间阅读。

【问题讨论】:

  • 它应该简单地返回带有数据类型和默认值的列名。您可以忽略 GetName()。在 java 中它会返回数据类型名称,即 string,int 但现在我们可以忽略它了。
  • Java 中 Class.getName() 的等价物是 C# 中的 Type.FullName。你剩下的问题似乎只是“我如何用另一种语言写这个”,实际上超出了 StackOverflow 的范围。
  • 我同意,但这是我已经尝试了近 6 个小时的东西,但没有得到任何结果。因此,我想我应该向专家寻求帮助。

标签: c# java asp.net generics code-conversion


【解决方案1】:

我不确定这是否是您要求的,但如果您需要类型的名称,请使用

//short class name
typeof(T).Name
//full name with namespace
typeof(T).FullName
//namespace only
typeof(T).Namespace

typeof(T) 在编译时解析,但如果您想在运行时动态获取它,请使用 object.GetType()

编辑

好的,我看到您的代码中有一些错误:

    public void SetColumnName(string columnName)
    {
        this._columnName = _columnName;
    }

应该是

    public void SetColumnName(string columnName)
    {
        this._columnName = columnName;
    }

相同
        this._dataTypes = _dataTypes;

应该是

        this._dataTypes = dataTypes;

基本上,您在这些方法中重新分配了相同的值,而忽略了作为参数发送的对象。这肯定行不通:

public void SetDataType(string type)
{
    try
    {
        SetDataType(type != null ? typeof (Type) : typeof (string));
    }

我不确定你想在这里实现什么,但typeof(Type)Type,我怀疑你打算使用它。此外,typeof(string) 将返回字符串类的类型,而不是传入参数的对象。 typeof(type)(在参数中发送的对象)也会返回一个字符串类型,因为那是参数类型。尽量避免混淆名称,这些名称类似于关键字,尤其是在从 Java 迁移到 C# 时,因为标准命名约定会欺骗您。

【讨论】:

  • 我很抱歉没有明确提及我的目标。我希望从上面的 C# 代码中返回列列表及其数据类型。
  • 我不明白。您有一些自定义列类,您想从哪里获取列列表?
  • 这是我正在转换为 C# 的大型代码库的一部分。列列表来自数据集。
  • 但它在您的代码中的什么位置?您向我们展示了整个课程,而没有提及您不能用 C# 重写其中的哪一部分。您问如何返回列的数据类型 - 这就是 GetDataType() 所做的。它出什么问题了?您的问题不清楚。
  • SetDataType(type != null ? typeof (Type) : typeof (string)); Tarec:这是正确的。这里我不确定 typeof(Type) 是否正确。
【解决方案2】:

如果您不想要命名空间,请尝试使用.GetType().FullName.GetType().Name

【讨论】:

  • 感谢它的帮助。 GetType().名称
猜你喜欢
  • 1970-01-01
  • 2023-01-27
  • 2020-06-16
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多