Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以从一个字符串开始并实例化该字符串的对象吗?_C#_.net_Asp.net_Linq To Sql - Fatal编程技术网

C# 我可以从一个字符串开始并实例化该字符串的对象吗?

C# 我可以从一个字符串开始并实例化该字符串的对象吗?,c#,.net,asp.net,linq-to-sql,C#,.net,Asp.net,Linq To Sql,我目前与LINQ和C合作 在我的LINQtoSQL模型中有一个表的下拉列表 我希望用户能够从下拉列表中选择LINQ表名。在代码中,我想创建该LINQ类的一个实例,然后运行Select或it或任何我想要的东西 如何根据用户选择的字符串中的对象名称创建对象?我从一开始就没有正确地思考吗?你想要和 请注意,Type.GetTypestring将仅查找当前正在执行的程序集和mscorlib,除非指定包含程序集的完整类型名。在这两种情况下,都需要指定类型名,包括名称空间 另一种方法是在调用Activato

我目前与LINQ和C合作

在我的LINQtoSQL模型中有一个表的下拉列表

我希望用户能够从下拉列表中选择LINQ表名。在代码中,我想创建该LINQ类的一个实例,然后运行Select或it或任何我想要的东西

如何根据用户选择的字符串中的对象名称创建对象?我从一开始就没有正确地思考吗?

你想要和

请注意,Type.GetTypestring将仅查找当前正在执行的程序集和mscorlib,除非指定包含程序集的完整类型名。在这两种情况下,都需要指定类型名,包括名称空间

另一种方法是在调用Activator.CreateInstance之前,直接从字符串获取类型


实际上这里有很多选择。如果这些都对您没有帮助,请发布更多信息,我相信我们可以找到解决方法。

由于您使用ASP.NET标记了帖子,我假设列表位于客户端。如果是这样的话,您应该非常小心,不要相信这些数据,我不建议直接从用户输入创建类型。您可以使用这些数据作为工厂的输入,然后工厂可以返回正确的实例,并在您认为合适的情况下处理任何非法输入

对于LINQ to SQL,有从数据上下文执行此操作的特定方法;基本上,db.GetTable。这将返回一个ITable,但使用非类型化的ITable有点棘手。你可以列举它,至少

要获取ITable,通常需要类型,例如Assembly.GetType:

当然,一旦有了类型,就可以使用Activator创建新的实体实例:

        object newObj = Activator.CreateInstance(type);
        // TODO: set properties (with reflection?)
        table.InsertOnSubmit(newObj);
但是,如果要使用属性名称,也可以:

    using (var ctx = new MyDataContext()) {
        string name = "Customers"; // property name
        ITable table = (ITable) ctx.GetType()
            .GetProperty(name).GetValue(ctx, null);
        foreach (var row in table) {
            Console.WriteLine(row); // works best if ToString overridden...
        }
    }

在etc中运行过滤器对于非类型化的数据是很棘手的,因为构建表达式将是曲折的。那时我可能会开始切换到类型化模型…

详细阐述Brian Rasmussen的警告:类型应该受到限制,需要有意识的设计。用户可实例化类型最好使用特定的自定义属性进行标记,该属性可以通过反射进行验证。

继续Marc Gravell的回答

按照他的建议,我注意到System.Linq中定义了一个Cast扩展方法

不幸的是,您似乎无法使用类型实例强制转换:

Type dcType = dc.GetType();
Type type = dcType.Assembly.GetType(String.Format("{0}.{1}", dcType.Namespace, name));
var row = dc.GetTable(type).Cast<type>().SingleOrDefault(i => i.ID == 123);

这里似乎有人问我想做什么:
Type dcType = dc.GetType();
Type type = dcType.Assembly.GetType(String.Format("{0}.{1}", dcType.Namespace, name));
var row = dc.GetTable(type).Cast<type>().SingleOrDefault(i => i.ID == 123);