我正在尝试创建一个通用扩展,使用'TryParse'来检查字符串是否是给定类型:
public static bool Is<T>(this string input)
{
T notUsed;
return T.TryParse(input, out notUsed);
}
Run Code Online (Sandbox Code Playgroud)
这将无法编译,因为它无法解析符号'TryParse'
据我了解,'TryParse'不是任何界面的一部分.
这有可能吗?
更新:
使用下面的答案,我想出了:
public static bool Is<T>(this string input)
{
try
{
TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(input);
}
catch
{
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
它运作得很好,但我认为以这种方式使用异常对我来说感觉不对.
UPDATE2:
修改为传递类型而不是使用泛型:
public static bool Is(this string input, Type targetType)
{
try
{
TypeDescriptor.GetConverter(targetType).ConvertFromString(input);
return true;
}
catch
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud) 是否有任何优雅的快速方法将对象映射到字典,反之亦然?
IDictionary<string,object> a = new Dictionary<string,object>();
a["Id"]=1;
a["Name"]="Ahmad";
// .....
Run Code Online (Sandbox Code Playgroud)
变
SomeClass b = new SomeClass();
b.Id=1;
b.Name="Ahmad";
// ..........
Run Code Online (Sandbox Code Playgroud) 可能重复:
.NET反射的代价是多少?
我目前处于一种编程心态,反思是我最好的朋友.我使用它来动态加载内容,允许"松散实现"而不是严格的接口,以及许多自定义属性.
使用反射的"实际"成本是多少?
经常反映的类型是否值得缓存反射,例如我们自己的LINQ DAL目标代码在表定义的所有属性上?
缓存内存占用量是否会超过反射CPU的使用量?
我最近创建了一个接口层来区分DataAccessProvider和业务逻辑层.通过这种方法,我们可以随时通过更改Web/App.Config中的值来更改DataAccessProvider的选择.(如果需要,可以给出更多细节).
无论如何,要做到这一点,我们使用反射来完成我们可以工作的DataProvider类.
/// <summary>
/// The constructor will create a new provider with the use of reflection.
/// If the assembly could not be loaded an AssemblyNotFoundException will be thrown.
/// </summary>
public DataAccessProviderFactory()
{
string providerName = ConfigurationManager.AppSettings["DataProvider"];
string providerFactoryName = ConfigurationManager.AppSettings["DataProviderFactory"];
try
{
activeProvider = Assembly.Load(providerName);
activeDataProviderFactory = (IDataProviderFactory)activeProvider.CreateInstance(providerFactoryName);
}
catch
{
throw new AssemblyNotFoundException();
}
}
Run Code Online (Sandbox Code Playgroud)
但现在我想知道反思有多缓慢?
我有一个类A和一个B继承类的类A,并用更多的字段扩展它.
拥有a类型的对象A,如何创建包含对象包含的所有数据b的类型的B对象a?
我试过a.MemberwiseClone()但只给了我另一个类型的A对象.我不能A投入,B因为继承关系只允许相反的演员.
这样做的正确方法是什么?
可能重复:
.NET反射的代价是多少?
我遇到的问题的"优雅"解决方案是使用属性将类及其属性与另一个类相关联.问题是,要将它转换为另一个,我必须使用反射.我正在考虑将其托管在云端的服务器端应用程序.
我听过很多关于"反射很慢,不使用它"的隆隆声,慢得多慢?它是如此占用CPU密集度,以至于它会大大增加我的CPU时间,以至于我真的要为我决定在云端架构底部使用反射付出代价吗?
我在.NET/C#中使用反射API,如GetType()和GetTypes().
我即将在服务器应用程序上编写一组方法,这些方法接收从TCP套接字接收的消息,对它们进行编码/解码,并加密/解密它们.
考虑消息被定义为特殊类型,每个都有自己的属性和总长度,我需要选择以下解决方案之一:1.制作使用泛型的方法,例如Encode<T>(...) where T : IMessage然后为每种类型的实现编码器/解码器消息,并有ResolveEncoder<T>将挑选编码器被通缉的消息或2.使用任何类型的消息的制作方法,只要它实现IMessage,比如Encode(IMessage message),用的System.Reflection决定一切,我需要了解它.
我对解决方案#2更感兴趣,因为它使我的代码缩小了30倍.但是,我担心不断反映属性是否会影响性能.现在由于时间限制完成项目,我无法真正"实验".
我将非常感谢任何个人经验或与基准测试相关的性能与任何一种解决方案的关系.
可能重复:
反射的代价是多少?
为了使我的代码具有通用性,我已经开始使用Reflection - 在DTO对象中获得一些优势并设置它们 -
与硬编码的setter相比,使用反射获取属性并设置它们会如此严重地影响性能?
c# ×10
reflection ×7
.net ×6
generics ×2
performance ×2
assemblies ×1
caching ×1
copy ×1
delegates ×1
dictionary ×1
idictionary ×1
mapping ×1
object ×1
oop ×1
optimization ×1
subclass ×1
tryparse ×1
vb.net ×1